In [1]:
import pandas as pd
import numpy as np
import math
import sqlite3
import os
import matplotlib.pyplot as plt
import seaborn as sns
from datetime import datetime
from sklearn.impute import KNNImputer
from sklearn.decomposition import PCA
from sklearn.preprocessing import MinMaxScaler, StandardScaler, OneHotEncoder
from pandas_profiling import ProfileReport
from sklearn.cluster import MeanShift, DBSCAN, estimate_bandwidth
from collections import Counter
from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import silhouette_score, silhouette_samples
from sklearn.neighbors import NearestNeighbors
sns.set()
In [2]:
from os.path import join
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import matplotlib.cm as cm
from sklearn.metrics import silhouette_score, silhouette_samples
from sklearn.cluster import KMeans
from sklearn.base import clone
from sklearn.manifold import TSNE
In [3]:
import sompy
from sompy.visualization.mapview import View2D
from sompy.visualization.bmuhits import BmuHitsView
from sompy.visualization.hitmap import HitMapView
In [4]:
from collections import Counter
from os.path import join
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
import pandas as pd
from sklearn.cluster import DBSCAN, KMeans, AgglomerativeClustering
from sklearn.base import clone
from sklearn.metrics import pairwise_distances
from scipy.cluster.hierarchy import dendrogram
from sklearn.manifold import TSNE
from sklearn.tree import DecisionTreeClassifier, export_graphviz
from sklearn.model_selection import train_test_split
import graphviz

sns.set()
In [5]:
from os.path import join
import pandas as pd
import numpy as np

import seaborn as sns
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans, AgglomerativeClustering
from sklearn.neighbors import KNeighborsClassifier

import sompy
from sompy.visualization.mapview import View2D
from sompy.visualization.bmuhits import BmuHitsView
from sompy.visualization.hitmap import HitMapView
In [6]:
data = pd.read_csv('donors.csv').drop(columns=['Unnamed: 0'])
C:\Users\putos\anaconda3\lib\site-packages\IPython\core\interactiveshell.py:3071: DtypeWarning: Columns (9,412) have mixed types.Specify dtype option on import or set low_memory=False.
  has_raised = await self.run_ast_nodes(code_ast.body, cell_name,

I. Count Missing cases

In [7]:
percent_missing = data.isnull().sum() * 100 / len(data)
list(percent_missing )
Note: NumExpr detected 12 cores but "NUMEXPR_MAX_THREADS" not set, so enforcing safe limit of 8.
NumExpr defaulting to 8 threads.
Out[7]:
[0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 25.03144258583826,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 87.01840439357733,
 22.30956273843961,
 0.0,
 46.88299165723389,
 0.0,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.458432901521824,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 55.395547729845305,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 45.930281306334635,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.1383473776883411,
 0.1383473776883411,
 0.1383473776883411,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 2.043768079486857,
 2.2963568523875404,
 35.205215276904376,
 3.728042594222949,
 9.300716890957112,
 3.6798306292709513,
 11.785729258374209,
 34.32272670104389,
 10.923154320211294,
 9.352073114492937,
 42.152978660965076,
 19.7742422336813,
 68.62553976439023,
 21.343227267010437,
 28.979583280929024,
 22.28545675596361,
 25.65715004401962,
 52.61392696935396,
 36.905211084559596,
 26.881314719322518,
 58.975810170628435,
 38.75089087326542,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 99.7463631409047,
 99.70548777931496,
 99.99056722424852,
 99.1866851129837,
 90.67727329895611,
 77.49549322936318,
 82.46132561941894,
 89.03597031819896,
 84.55120949146858,
 73.06418479855783,
 87.1609441160441,
 75.56177420031024,
 92.38879805475202,
 71.70796126273424,
 90.14694168448413,
 79.27095124303023,
 83.35953548819855,
 91.73269609692701,
 90.02955603068797,
 78.12329685993376,
 91.76309059657066,
 81.40904708003187,
 99.7463631409047,
 99.70548777931496,
 99.99056722424852,
 99.1866851129837,
 90.67727329895611,
 77.49549322936318,
 82.46132561941894,
 89.03597031819896,
 84.55120949146858,
 73.06418479855783,
 87.1609441160441,
 75.56177420031024,
 92.38879805475202,
 71.70796126273424,
 90.14694168448413,
 79.27095124303023,
 83.35953548819855,
 91.73269609692701,
 90.02955603068797,
 78.12329685993376,
 91.76309059657066,
 81.40904708003187,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0020961723892172894,
 10.452563618832013,
 10.452563618832013,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.0,
 0.1383473776883411]

I. Data Wrangling

1. Cleaning Data

1.1 Dropping some useless variables

A: After the metadata evaluation we decided to drop some variables that we considered useless, below we have the explanation for the process:

1. OSOURCE: Code indicating which mailing list the donor was originally acquired. Not relevant for the analysis .
2. TCODE: Code indicating the Donor title code. Not relevant for the analysis .
3. MAILCODE: Code indicating if the Address is OK or is Bad Address. Not relevant for the analysis .
4. ZIP: Code indicating the Zipcode. Not relevant for the analysis .
5. PVASTATE: Code Indicating if whether the donor lives in a state served by the organization's EPVA chapter. 98,45% of Missing cases .
6. NOEXCH: Code Indicating if it is possible to Exchange Flag (For list rental). Not relevant for the analysis .
7. RECINHSE: Code Indicating if the donor is an in house record or if has given to PVA's In House program. Not relevant for the analysis .
8. RECP3: Code Indicating if the donor has given to PVA's P3 program. Not relevant for the analysis .
9. RECPGVG: Code Indicating if the donor has Planned Giving Record. Not relevant for the analysis .
10. RECSWEEP: Code Indicating if the donor is Sweepstakes Record. Not relevant for the analysis .

11. HOMEOWNR: Code Indicating if the donor has Home owner or not. Not relevant for the analysis .

12. DATASRCE: The Code Indicates which third-party data source the donor matched against. Not relevant for the analysis .
12. SOLP3: Indicating if the donor has solicited some limitation for code P3 . Not relevant for the analysis .
13. SOLIH: Indicating if the donor has solicited some limitation for code in house . Not relevant for the analysis .
14. MAJOR: Indicating if the donor is Major Donor or not . Repeated variable. The same information is reported on variable "MDMAUD" .
15. GEOCODE: Code indicating the level geography at which a record matches the census data, when is blank indicate that No code has been assigned or did not match at any level. 80.02% have no code assigned or did not match at any level.
16. LIFESRC: Code Indicates source of the lifestyle variables listed above. Not relevant for the analysis and have 56.6% of missing cases .
17. PEPSTRFL: Code Indicating if the donor has PEP Star RFA Status or not. Not relevant for the analysis.
18. HPHONE_D: Code Indicating if Indicator for presence of a published home phone number. Not relevant for the analysis.
19. MDMAUD_R: The code is part of the Major Donor Matrix . Repeated information. The same information is reported on summary variables .
20. MDMAUD_F: The code is part of the Major Donor Matrix . Repeated information. The same information is reported on summary variables .
21. MDMAUD_A: The code is part of the Major Donor Matrix . Repeated information. The same information is reported on summary variables .
22. GEOCODE2: The code represents the County Size Code. The 1st byte of the variable "DOMAIN/Cluster code" provides better information because we do not know the meaning of "A", "B", "C", etc..
23. MDMAUD: The code represents the County Size Code. Not relevant for the analysis .
In [8]:
data=data.drop(columns=['OSOURCE','MAILCODE','ZIP','PVASTATE','NOEXCH','RECINHSE','RECP3','RECPGVG','RECSWEEP',"MDMAUD",\
                        "HOMEOWNR",'DATASRCE','SOLP3','SOLIH','MAJOR','GEOCODE','LIFESRC','PEPSTRFL','HPHONE_D','RFA_2R',\
                        'MDMAUD_R','MDMAUD_F','MDMAUD_A','GEOCODE2'])

1.2 Computing new variables

1.2.1 Aggregating variables

We noticed that some variables can be aggregate in one. This aggregation will allow to reduce the number of the variables and put them in global level. If some of this new variable be considerate relevant, they can be analysed in more details later.

A: 1st Aggregation. Variable: "donor_resp_maill_offer":

Variables to be aggregated: "HIT", "MBCRAFT", "MBGARDEN", "MBBOOKS", "MBCOLECT", "MAGFAML", "MAGFEM", "MAGMALE", "PUBGARDN", "PUBCULIN", "PUBHLTH", "PUBDOITY", "PUBNEWFN", "PUBPHOTO", "PUBOPP"

All the variables above are referent to the number of mails order offer responded by the donor (from PVA's and other from PVA's). For this analysis we are going to focus only to understand the effect of respond or not respond not on the number that the donor had responded.

For this group of variables, we are going to create new variable “donor_resp_maill_offer” which is going to inform the type of mail order offer that donor chose to respond.
Rule applied for the variable:
  1. 1st Classification: hit : All the donor who have responded something different than “0” on the variable HIT and no response on any off the other types of mail order offers ("MBCRAFT", "MBGARDEN", "MBBOOKS", "MBCOLECT", "MAGFAML", "MAGFEM", "MAGMALE", "PUBGARDN", "PUBCULIN", "PUBHLTH", "PUBDOITY", "PUBNEWFN", "PUBPHOTO", "PUBOPP"). RULE: If the donor has respond any response different than “0” on the variable HIT and none response on any off the other types of mail order offers.
  2. 2st Classification: other types: All the donor who have responded something different than “0” on the any of other types of mail order offers and have no response or responded “0” on variable HIT.
  3. 3rd Classification: both : If the donor has responded something different than “0” on “the other types of mail order offers” and “on the variable HIT”
  4. 4th Classification: None : If the donor has no response or responded “0” on both question “the other types of mail order offers” and “on the variable HIT”
In [9]:
# Function to return 1 if the donor had responded to any mail order offer and 0 if he has not.
def donor_resp_maill_0_1(v1):
    if v1>0:
        return 1
    else:
        return 0
In [10]:
# Applying the function above to all the variables referent to the number of mails order offer responded.
data["hit_0_1"]= data ["HIT"].apply(lambda x:donor_resp_maill_0_1(x))
data["MBCRAFT_0_1"]= data ["MBCRAFT"].apply(lambda x:donor_resp_maill_0_1(x))
data["MBGARDEN_0_1"]= data ["MBGARDEN"].apply(lambda x:donor_resp_maill_0_1(x))
data["MBBOOKS_0_1"]= data ["MBBOOKS"].apply(lambda x:donor_resp_maill_0_1(x))
data["MBCOLECT_0_1"]= data ["MBCOLECT"].apply(lambda x:donor_resp_maill_0_1(x))
data["MAGFAML_0_1"]= data ["MAGFAML"].apply(lambda x:donor_resp_maill_0_1(x))
data["MAGFEM_0_1"]= data ["MAGFAML"].apply(lambda x:donor_resp_maill_0_1(x))
data["MAGMALE_0_1"]= data ["MAGMALE"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBGARDN_0_1"]= data ["PUBGARDN"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBCULIN_0_1"]= data ["PUBCULIN"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBHLTH_0_1"]= data ["PUBHLTH"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBDOITY_0_1"]= data ["PUBDOITY"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBNEWFN_0_1"]= data ["PUBNEWFN"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBPHOTO_0_1"]= data ["PUBPHOTO"].apply(lambda x:donor_resp_maill_0_1(x))
data["PUBOPP_0_1"]= data ["PUBOPP"].apply(lambda x:donor_resp_maill_0_1(x))
In [11]:
# Creating new variable "Pre_other_types" which is going to aggregate all the variables above where \
# 0 indicate that donor does not have interest on collecting  any object
data["other_types_0_1"]= data["MBCRAFT_0_1"] + data ["MBGARDEN_0_1"] + data ["MBBOOKS_0_1"] + data ["MBCOLECT_0_1"]\
                         + data ["MAGFAML_0_1"] + data ["MAGFEM_0_1"] + data ["MAGMALE_0_1"] + data ["PUBGARDN_0_1"]\
                         + data ["PUBCULIN_0_1"] + data ["PUBHLTH_0_1"] + data ["PUBDOITY_0_1"]+ data ["PUBNEWFN_0_1"]\
                         + data ["PUBPHOTO_0_1"] + data ["PUBOPP_0_1"]
# If the sum is equal to 0 means that the donor did not respond any email for all the other types
# If the sum is >0 means that the donor responded at least one email for other types
In [12]:
# Function to return "None" if the donor does not have interest in collecting certain objects and yes if he has interest.
def donor_resp_maill_y_n(v1, v2):
        if (v1==0) & (v2==0):
            return "None"
        elif (v1>0) & (v2==0):
            return "hit"
        elif (v1==0) & (v2>0):
            return "other types"
        else:
            return "both"
In [13]:
# Applying the function above to "data["hit_0_1"]" and "data["other_types_0_1"]" 
# Creating new variable "donor_resp_maill_offer"
data["donor_resp_maill_offer"]=data.apply(lambda x: donor_resp_maill_y_n(x["hit_0_1"], x["other_types_0_1"]), axis=1)
data["donor_resp_maill_offer"].value_counts()
Out[13]:
None           55577
both           30417
hit             9323
other types       95
Name: donor_resp_maill_offer, dtype: int64
Dropping variables used to aggregate
"HIT", "MBCRAFT", "MBGARDEN", "MBBOOKS", "MBCOLECT", "MAGFAML", "MAGFEM", "MAGMALE", "PUBGARDN", "PUBCULIN", "PUBHLTH", "PUBDOITY", "PUBNEWFN", "PUBPHOTO", "PUBOPP"
In [14]:
data=data.drop(columns=["HIT", "MBCRAFT", "MBGARDEN", "MBBOOKS", "MBCOLECT", "MAGFAML", "MAGFEM", "MAGMALE",\
                         "PUBGARDN", "PUBCULIN", "PUBHLTH", "PUBDOITY", "PUBNEWFN", "PUBPHOTO", "PUBOPP"])
"hit_0_1", "MBCRAFT_0_1", "MBGARDEN_0_1", "MBBOOKS_0_1", "MBCOLECT_0_1", "MAGFAML_0_1", "MAGFEM_0_1", "MAGMALE_0_1", "PUBGARDN_0_1", "PUBCULIN_0_1", "PUBHLTH_0_1", "PUBDOITY_0_1", "PUBNEWFN_0_1", "PUBPHOTO_0_1", "PUBOPP_0_1", "other_types_0_1"
In [15]:
data=data.drop(columns=["hit_0_1", "MBCRAFT_0_1", "MBGARDEN_0_1", "MBBOOKS_0_1", "MBCOLECT_0_1", "MAGFAML_0_1",\
                        "MAGFEM_0_1", "MAGMALE_0_1", "PUBGARDN_0_1", "PUBCULIN_0_1", "PUBHLTH_0_1", "PUBDOITY_0_1",\
                        "PUBNEWFN_0_1", "PUBPHOTO_0_1", "PUBOPP_0_1", "other_types_0_1"])
_*

B: 2nd Aggregation: Variable: "donor_interest_collecting"

Variables to be aggregated: "COLLECT1 ", "VETERANS", "BIBLE", "CATLG", "HOMEE ", "PETS", "CDPLAY", "STEREO", "PCOWNERS", "PHOTO", "CRAFTS", "FISHER", "GARDENIN", "BOATS", "WALKER" , "KIDSTUFF ", "CARDS", "PLATES"

All the variables above want to figure out if the donor has interest in collecting objects from third-party data sources.

For this group of variables, we are going to create new variable “donor_interest_collecting”. This new variable is going to inform if the donor has or not, interest in collecting things from third-party data sources.

Rule applied for the variable: If the donor has responded “yes” on one of the objects we are going to consider this donor with interest in collecting things from third party. On other and if he responded “no” for all the object, the donor does not have interest in collecting objects from third party data sources. Classification: Yes: for all the donors with interest; No: All the donors with no interest.

In [16]:
# Function to return 0 if the donor does not have interest in collecting certain objects and 1 if he has interest
def donor_interest(v1):
    if v1==' ':
        return 0
    else:
        return 1
In [17]:
# Applying the function above on the each collecting object.
data["COLLECT1_0_1"]= data ["COLLECT1"].apply(lambda x:donor_interest(x))
data["VETERANS_0_1"]= data ["VETERANS"].apply(lambda x:donor_interest(x))
data["BIBLE_0_1"]= data ["BIBLE"].apply(lambda x:donor_interest(x))
data["CATLG_0_1"]= data ["CATLG"].apply(lambda x:donor_interest(x))
data["HOMEE_0_1"]= data ["HOMEE"].apply(lambda x:donor_interest(x))
data["PETS_0_1"]= data ["PETS"].apply(lambda x:donor_interest(x))
data["CDPLAY_0_1"]= data ["CDPLAY"].apply(lambda x:donor_interest(x))
data["STEREO_0_1"]= data ["STEREO"].apply(lambda x:donor_interest(x))
data["PCOWNERS_0_1"]= data ["PCOWNERS"].apply(lambda x:donor_interest(x))
data["PHOTO_0_1"]= data ["PHOTO"].apply(lambda x:donor_interest(x))
data["CRAFTS_0_1"]= data ["CRAFTS"].apply(lambda x:donor_interest(x))
data["FISHER_0_1"]= data ["FISHER"].apply(lambda x:donor_interest(x))
data["GARDENIN_0_1"]= data ["GARDENIN"].apply(lambda x:donor_interest(x))
data["BOATS_0_1"]= data ["BOATS"].apply(lambda x:donor_interest(x))
data["WALKER_0_1"]= data ["WALKER"].apply(lambda x:donor_interest(x))
data["KIDSTUFF_0_1"]= data ["KIDSTUFF"].apply(lambda x:donor_interest(x))
data["CARDS_0_1"]= data ["CARDS"].apply(lambda x:donor_interest(x))
data["PLATES_0_1"]= data ["PLATES"].apply(lambda x:donor_interest(x))
In [18]:
# Creating new variable which is going to aggregate all the variables above where 0 indicate that donor does not\
# have interest on collecting  any object
data["Pre_donor_interest_collecting"]= data["COLLECT1_0_1"] + data ["VETERANS_0_1"]  + data ["BIBLE_0_1"] +\
                                       data ["CATLG_0_1"]  +  data ["HOMEE_0_1"] + data ["PETS_0_1"]  + \
                                       data ["CDPLAY_0_1"] + data ["STEREO_0_1"]+ data ["PCOWNERS_0_1"] + \
                                       data ["PHOTO_0_1"]+ data ["CRAFTS_0_1"]+ data ["FISHER_0_1"] +\
                                       data ["GARDENIN_0_1"] + data ["BOATS_0_1"] + data ["WALKER_0_1"]+\
                                       data ["KIDSTUFF_0_1"] + data ["CARDS_0_1"]+ data ["PLATES_0_1"]
In [19]:
# Function to return "no" if the donor does not have interest in collecting certain objects and yes if he has interest.
def donor_interest_y_n(v2):
        if v2==0:
            return "no"
        else:
            return "yes"
In [20]:
# Applying the function above on the Pre_donor_interest_collecting and creating the variable donor_interest_collecting.
data["donor_interest_collecting"]= data ["Pre_donor_interest_collecting"].apply(lambda x:donor_interest_y_n(x))
data["donor_interest_collecting"].value_counts()
Out[20]:
no     63737
yes    31675
Name: donor_interest_collecting, dtype: int64

Dropping variables used to aggregate:

"COLLECT1","VETERANS","BIBLE","CATLG","HOMEE","PETS","CDPLAY","STEREO","PCOWNERS","PHOTO","CRAFTS","FISHER", "GARDENIN","BOATS", "WALKER" ,"KIDSTUFF", "CARDS", "PLATES"
In [21]:
data=data.drop(columns=["COLLECT1","VETERANS", "BIBLE","CATLG","HOMEE","PETS","CDPLAY","STEREO","PCOWNERS","PHOTO",\
                        "CRAFTS","FISHER","GARDENIN","BOATS", "WALKER" ,"KIDSTUFF", "CARDS", "PLATES"])
"COLLECT1_0_1", "VETERANS_0_1", "BIBLE_0_1","CATLG_0_1", "HOMEE_0_1", "PETS_0_1", "CDPLAY_0_1", "STEREO_0_1", "PCOWNERS_0_1", "PHOTO_0_1", "CRAFTS_0_1", "FISHER_0_1", "GARDENIN_0_1", "BOATS_0_1", "WALKER_0_1", "KIDSTUFF_0_1", "CARDS_0_1", "PLATES_0_1"
In [22]:
data=data.drop(columns=["COLLECT1_0_1", "VETERANS_0_1", "BIBLE_0_1","CATLG_0_1", "HOMEE_0_1", "PETS_0_1", "CDPLAY_0_1",\
                        "STEREO_0_1", "PCOWNERS_0_1", "PHOTO_0_1", "CRAFTS_0_1", "FISHER_0_1", "GARDENIN_0_1",\
                        "BOATS_0_1", "WALKER_0_1", "KIDSTUFF_0_1", "CARDS_0_1",  "PLATES_0_1"])

C: 3rd Aggregation and filling Missing cases. Variable: "donor_have_child”.

Variables to be aggregated: "CHILD03", "CHILD07", "CHILD12", "CHILD18", "NUMCHLD"

In Summary all the variables above inform us if the donor has or not child.

For this group of variables, we are going to create new variable "donor_have_child”. This new variable is going to inform if the donor has or not child we think that the number of child is not important in these stage.

Rule applied for the variable: If the donor has responded “B”, “F”, “M”, on one of the following question “CHILD03, CHILD07, CHILD12, CHILD18” or a number different than “0” on the “NUMCHLD” we are going to consider that the donor has a child. On other hand if the donor has not response on “CHILD03, CHILD07, CHILD12, CHILD18” and “0” on the “NUMCHLD” we are going to consider that the donor has not a child Classification: Yes : for all the donors who have a child; No: All the donors who have not a child.

NOTE: For all the cases that we do not have any response for all the questions we are going to figure out later if they are missing cases or the donors do not have child.
In [23]:
# Function to return 0 if the donor does not have child and 1 if he has.
def donor_child(v1):
    if v1==' ':
        return 0
    else:
        return 1
In [24]:
# Applying the function above on the variables "CHILD03", "CHILD07", "CHILD12", "CHILD18".
data["CHILD03_0_1"]= data ["CHILD03"].apply(lambda x:donor_child(x))
data["CHILD07_0_1"]= data ["CHILD07"].apply(lambda x:donor_child(x))
data["CHILD12_0_1"]= data ["CHILD12"].apply(lambda x:donor_child(x))
data["CHILD18_0_1"]= data ["CHILD18"].apply(lambda x:donor_child(x))
In [25]:
# Creating a function that recives dataframe and the column "NUMCHLD" and will return a series with binary values (0,1) 
# which 0 indicates no child from the donor and 1 indicates at least 1 child from the donor. 
def binary_values_numchild (data_frame, column):
    import math
    b=[]
    for i in data_frame [column]:
        if math.isnan(i) is True:
            a=0
        else:
            a=1
        b.append(a)
    data_frame[column+"binary"]=b
In [26]:
binary_values_numchild(data, "NUMCHLD")
data['NUMCHLDbinary'].value_counts()
Out[26]:
0    83026
1    12386
Name: NUMCHLDbinary, dtype: int64
In [27]:
data['NUMCHLDbinary'].value_counts()
Out[27]:
0    83026
1    12386
Name: NUMCHLDbinary, dtype: int64
In [28]:
# Creating a function that recives dataframe, 5 columns and will return a series with binary values (0,1) 
# which 0 indicates no child from the donor and 1 indicates at least 1 child from the donor. 
def binary_values_ (data_frame, column1, column2, column3, column4, column5):
    import math
    b=[]
    for i in list(range (0, len(data_frame))):
        if (data_frame[column1][i] + data_frame[column2][i] + data_frame[column3][i] + data_frame[column4][i]\
            + data_frame[column5][i])==0:
            a= 0
        else:
            a= 1
        b.append(a)
    data_frame['donor_have_child_y_n']=b
In [29]:
# Applying the function above on the variables "CHILD03_0_1", "CHILD07_0_1", "CHILD12_0_1", "CHILD18_0_1", "NUMCHLDbinary".
binary_values_(data, "CHILD03_0_1", "CHILD07_0_1", "CHILD12_0_1", "CHILD18_0_1", "NUMCHLDbinary")
data['donor_have_child_y_n'].value_counts()
Out[29]:
0    81482
1    13930
Name: donor_have_child_y_n, dtype: int64

C1: Filling Missing cases: Variable: "donor_have_child_y_n"

CHIL1: Percent Children Under Age 7 CHIL2: Percent Children Age 7 - 13 CHIL3: Percent Children Age 14-17

Rule to be applied: • If CHIL1+ CHIL2+ CHIL1 is between 90 and 110: The donor has child (1) • Else: The donor has not child (0)

In [30]:
# Creating a function that recives dataframe, 3 columns and will return a series with binary values (0,1)  
# which 0 indicates no child from the donor and 1 indicates at least 1 child from the donor. 
def binary_values_3 (data_frame, column1, column2, column3):
    import math
    b=[]
    for i in list(range (0, len(data_frame))):
        if (data_frame[column1][i] + data_frame[column2][i] + data_frame[column3][i])>=90 and (data_frame[column1][i]\
            + data_frame[column2][i] + data_frame[column3][i])<=110:
            a= 1
        else:
            a= 0
        b.append(a)
    data_frame['donor_have_child_y_n']=b
In [31]:
# Applying the function above on the variables "CHIL1", "CHIL2", "CHIL3".
binary_values_3(data, "CHIL1", "CHIL2", "CHIL3")
data['donor_have_child_y_n'].value_counts()
Out[31]:
1    94420
0      992
Name: donor_have_child_y_n, dtype: int64
In [32]:
# Function to return "no" if the donor does not have interest in collecting certain objects and yes if he has interest.
def child_y_n(v2):
        if v2==0:
            return "no"
        else:
            return "yes"
In [33]:
# Applying the function above on the donor_have_child_y_n.
data["donor_have_child_y_n"]= data ["donor_have_child_y_n"].apply(lambda x:child_y_n(x))
data["donor_have_child_y_n"].value_counts()
Out[33]:
yes    94420
no       992
Name: donor_have_child_y_n, dtype: int64

After using characteristics of the donors neighbourhood we are going to consider that 992 donor do not have any child

Dropping variables used to aggregate
"CHILD03", "CHILD07", "CHILD12", "CHILD18", "NUMCHLD"
In [34]:
data=data.drop(columns=["CHILD03", "CHILD07", "CHILD12", "CHILD18", "NUMCHLD"])
"CHILD03_0_1", "CHILD07_0_1", "CHILD12_0_1", "CHILD18_0_1", "NUMCHLDbinary"
In [35]:
data=data.drop(columns=["CHILD03_0_1", "CHILD07_0_1", "CHILD12_0_1", "CHILD18_0_1", "NUMCHLDbinary"])

1.2.2 Disaggregating variables

We noticed that some variables are aggregate and contains relevant insights. For these variables we decided to disaggregate them.

A: 1st Disaggregation

In this step we decided to split the variable 'DOMAIN' in two different variables. 'urban_city_level' which stores Urbanicity level of the donor's neighborhood and 'social_economical_status' which stores Socio-Economic status of the neighborhood.
We did this so that we could better visualize the information in this variable and also work with it separately.
In [36]:
#Variable that stores the urban city level from the disaggregation of DOMAIN corresponding to the first byte
data['urban_city_level'] = [data['DOMAIN'][i][0] for i in range(len(data))]
In [37]:
#Updating the former variable data['urban_city_level'] with a name instead of the code
D=[]
for i in range(len(data['urban_city_level'])):
    if data['urban_city_level'][i] == 'C':
        D.append('City')
    elif data['urban_city_level'][i] == 'S':
        D.append('Suburban')
    elif data['urban_city_level'][i] == 'T':
        D.append('Town')
    elif data['urban_city_level'][i] == 'R':
        D.append('Rural')
    elif data['urban_city_level'][i] == 'U':
        D.append('Urban')
    else:
        D.append('Suburban')
data['urban_city_level']=D
data['urban_city_level'].value_counts()
Out[37]:
Suburban    24240
Rural       19790
City        19689
Town        19527
Urban       12166
Name: urban_city_level, dtype: int64
In [ ]:
 
In [38]:
#Variable that stores the urban city level from the disaggregation of DOMAIN corresponding to the second byte
B=[]
for o in range(len(data)):
    if data['DOMAIN'][o]!=' ':
        B.append(data['DOMAIN'][o][1])
    else:
        B.append(0)
data['social_economical_status']=B
In [39]:
modes = data['social_economical_status'].mode().loc[0]
modes
Out[39]:
'2'
In [40]:
#Updating the former variable data['social_economical_status'] with a name instead of the code
E=[]
for o in range(len(data['social_economical_status'])):
    if data['social_economical_status'][o] == '1':
        E.append('Highest SES')
    elif data['social_economical_status'][o] == '2':
        E.append('Above average SES')
    elif data['social_economical_status'][o] == '3':
        E.append('Below average SES')
    elif data['social_economical_status'][o] == '4':
        E.append('Lowest SES')
    else:
        E.append('Above average SES')
data['social_economical_status']=E
data['social_economical_status'].value_counts()
Out[40]:
Above average SES    48356
Highest SES          28498
Below average SES    16754
Lowest SES            1804
Name: social_economical_status, dtype: int64
Dropping variable 'DOMAIN'
In [41]:
data=data.drop(columns=['DOMAIN'])

1.2.3 Transforming Variables and filling Missing cases

A: 1st Transformation and filling Missing cases: Variable: "Age"

In this step we are going transform some variables in order to be easier to interpret them. Such as:

"DOB”: Date of birth with the following format “YYMM, Year/Month format” - The new variable will be "Age" and will only take in account the donor's year of birth relative to 2020.

• During this stage we found 2593 NaN in DO.B. In order to solve this problem, we decided to use the mean age per State. We proceeded this way because we found that the wealth varies from state to state and we will use this variable, "wealth 2", later on the project.

In [42]:
# Here we are using a for loop to create a new variable storing the age considering that the present year is 2018
x=[]
for i in data['DOB']:
    if i is np.nan:
        x.append(0)
    else:
        x.append(2020-int(i.split('-')[0]))
data['Age']=x
In [43]:
# Calculating the mean age per State
avg_age_per_state = data.loc[data["Age"]>=0].groupby(["STATE"])["Age"].mean().sort_values(ascending=False)
NOTE: We noticed that two states (AS, VI) have mean of age equal to zero. For that reason we decided to replace the zeros using some information from the 2010 US Census. The variable that we are taking in account is 'AGE904', Average Age of Population.
In [44]:
#Here we are using a for loop to fill all the missing cases using the average age per state
F=[]
for i in range(0,len(data['Age'])):
    if data['Age'][i] == 0:
        for j in avg_age_per_state.index:
            if data['STATE'][i] == j:
                a = avg_age_per_state[j].astype(int) 
                F.append(a)
    else:
        a = data['Age'][i]
        F.append(a)  
data['Age']=F
In [45]:
# Here we are using a for loop to fill all the missing cases with the average age of the neighboor
for i in range(0,len(data['Age'])):
    if data['Age'][i]==0:
        data['Age'][i] = data['AGE904'][i]
    else:
        data['Age'][i]=data['Age'][i]
<ipython-input-45-b43bb96215a6>:6: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  data['Age'][i]=data['Age'][i]
<ipython-input-45-b43bb96215a6>:4: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  data['Age'][i] = data['AGE904'][i]
In [46]:
# Grouping Age values into Classes: 01) underage : Age 0- 17 anos; 02) young : Age 18 - 65;  
# 03) middle age: Age 66 - 79;  04) elderly : Age 80 - 99; 05) long-term elderly : Age > 102
In [47]:
data['Age']= data['Age'].astype(int)
data['Age'].value_counts()
Out[47]:
44    6794
48    3988
49    3909
50    3595
42    3458
      ... 
8        1
11       1
12       1
15       1
17       1
Name: Age, Length: 88, dtype: int64
In [48]:
i=[]
for o in range(len(data['Age'])):
    if data['Age'][o] >=0 and data['Age'][o]<19:
        i.append('Age 0-18')
    elif data['Age'][o]>=19 and data['Age'][o]<25:
        i.append('Age 18-24')
    elif data['Age'][o]>=25 and data['Age'][o]<35:
        i.append('Age 25-34')
    elif data['Age'][o]>=35 and data['Age'][o]<45:
        i.append("Age 35-44")
    elif data['Age'][o]>=45 and data['Age'][o]<55:
        i.append("Age 45-54")
    elif data['Age'][o]>=55 and data['Age'][o]<65:
        i.append("Age 55-64")    
    elif data['Age'][o]>=65 and data['Age'][o]<74:
        i.append("Age 65-74")       
    else:
        i.append('Age >= 75')
data['Group_age']=i
data['Group_age'].value_counts()
Out[48]:
Age 45-54    24492
Age >= 75    21624
Age 35-44    21061
Age 55-64    12444
Age 65-74    11655
Age 25-34     2941
Age 18-24      668
Age 0-18       527
Name: Group_age, dtype: int64
In [49]:
data.loc[data["Age"]==0]
Out[49]:
ODATEDW TCODE STATE DOB INCOME GENDER WEALTH1 MALEMILI MALEVET VIETVETS ... RFA_2F RFA_2A donor_resp_maill_offer Pre_donor_interest_collecting donor_interest_collecting donor_have_child_y_n urban_city_level social_economical_status Age Group_age
18715 2016-01-01 28 AS NaN NaN F NaN 0 0 0 ... 1 G None 0 no no Suburban Above average SES 0 Age 0-18
37117 2015-01-01 1 VI NaN NaN M NaN 0 40 29 ... 2 F None 0 no no Suburban Above average SES 0 Age 0-18
64356 2010-01-01 2 VI NaN NaN F NaN 0 0 0 ... 2 F None 0 no no Suburban Above average SES 0 Age 0-18
65358 2016-01-01 1 VI NaN NaN M NaN 0 0 0 ... 3 E None 0 no no Suburban Above average SES 0 Age 0-18
68255 2011-01-01 0 VI NaN NaN F NaN 0 0 0 ... 2 F None 0 no no Suburban Above average SES 0 Age 0-18
84821 2014-01-01 2 VI NaN NaN F NaN 0 0 0 ... 1 G None 0 no no Suburban Above average SES 0 Age 0-18

6 rows × 420 columns

NOTE: After this stage we noticed that some cases remained zero. This happens because also the neighboors have zero in the average age aswell. This occurs in the following states:AS and VI. We searched this information in other variables but still we couldnt find. We also noticed that most variables had no consistence for future analysis, so we decided to drop this six observations (CONTROLN:173966,28195,14976,14973,14974,14971).
Dropping unconsistent observations (173966,28195,14976,14973,14974,14971)
In [50]:
# data=data.loc[~data["CONTROLN"].isin([173966,28195,14976,14973,14974,14971])].reset_index
data=data.drop([18715,37117,64356,65358,68255,84821],axis=0).reset_index(drop=True)
# .reset_index
In [ ]:
 
Dropping variable 'DOB'
In [51]:
data=data.drop(columns=['DOB'])

B: 2nd Transformation and filling Missing cases: Variable: "WEALTH2"

Here we are going to update a variable that measures the wealth of every donor.

For that we will use three variables "WEALTH1”,"WEALTH2” and eventualy "INCOME”.

•WEALTH1 -  Wealth Rating

•WEALTH2 - Wealth rating uses median family income and population statistics from each area to index relative wealth  
within each state

•First step Compare the missing cases between "WEALTH1" (44732 NaN) and "WEALTH2" (43823 NaN):
In [52]:
print("Number of missing cases in Wealth 1 is :", data['WEALTH1'].isnull().sum())
print("Number of missing cases in Wealth 2 is :", data['WEALTH2'].isnull().sum())
Number of missing cases in Wealth 1 is : 44726
Number of missing cases in Wealth 2 is : 43818
In [53]:
NA2=list(data['WEALTH2'].isna()) #list of nans from wealth2
NA1=list(data['WEALTH1'].isna()) #list of nans from wealth1
In [ ]:
 
In [54]:
# aaa=data.loc[(data["WEALTH2"]>=0) & (data["INCOME"]>=0)&(data["STATE"]=="AR")]

• Off all missing cases of wealth1 and wealht2, 21843 are in common, which leaves us with with 43823 - (44732-21843) = 20943 possible values to reduce number of NaN at WEALTH2

• For this reason we might this values(no NaN values) to complete WEALTH2 (feature with less number of NaN and also with a more significant ranking)

• Completing the WEALTH2 with this values from WEALTH would result on a reduction of 21980/43823 = 49% of the NaN present in WEALTH2

• To use this method we will need to check if the information from both rankings are consistent, for that reason, we will need to compute the median rank for each state according to WEALTH2 observations and measure the difference between WEALTH1 observations and median , as follows:

In [55]:
ranking_per_state_w2=pd.pivot_table(data,columns=['STATE'],values='WEALTH2',aggfunc=np.median)
ranking_per_state_w1=pd.pivot_table(data,columns=['STATE'],values='WEALTH1',aggfunc=np.median)
list(ranking_per_state_w2.values)
Out[55]:
[array([2.5, 3. , 4. , 6. , 6. , 5. , 5. , 5. , 5. , 8. , 5. , 5. , 5. ,
        4. , 5. , 5. , 5. , 5. , 5. , 4. , 5. , 5. , 3. , 5. , 6. , 5. ,
        4. , 5. , 5. , 5. , 5. , 5. , 5. , 1. , 7. , 5. , 6. , 4. , 7. ,
        4. , 4. , 7. , 6. , 5. , 4. , 5. , 5. , 5. , 4. , 6.5, 5. , 5. ,
        4. , 4. ])]
In [56]:
list(ranking_per_state_w1.values)
Out[56]:
[array([3. , 6. , 5. , 6. , 6. , 6. , 6. , 6. , 5. , 7.5, 5. , 5. , 6. ,
        6. , 5. , 6. , 6. , 6. , 5. , 6. , 6. , 4.5, 5.5, 7. , 5. , 5. ,
        6. , 7. , 5. , 6. , 5. , 5. , 4. , 7. , 6. , 7. , 5. , 7. , 6. ,
        5. , 5. , 6.5, 6. , 5. , 6. , 6. , 6. , 6. , 7. , 5. , 5. , 4.5,
        4.5])]

• As we may see between both columns (WEALTH1 & WEALTH2) there isnt much difference in median values per state. For that reason we will use the values from WEALTH1 to complete some missing cases from WEALTH2

In [57]:
l = []

for i in range(0,len(data['WEALTH2'])):
    if NA1[i]!=True and NA2[i]==True:
        a=data['WEALTH1'][i]
        l.append(a)
    if NA2[i] == True and NA1[i]==True:
        b = np.nan
        l.append(b)
    if NA2[i] == False:
        c=data['WEALTH2'][i]
        l.append(c)
data['WEALTH2']=l
print ("With this we reduced the number of NaNs from 43823 to 21838")
data['WEALTH2'].isna().value_counts()
With this we reduced the number of NaNs from 43823 to 21838
Out[57]:
False    73568
True     21838
Name: WEALTH2, dtype: int64

With this we reduced the number of NaNs from 43823 to 21838

To solve this we are going to use the median wealth2 per state as follows:

In [58]:
median_wealht_pivot = pd.pivot_table(data,values='WEALTH2',columns=['STATE'], aggfunc=(np.median))
list(median_wealht_pivot.values)
Out[58]:
[array([2. , 4.5, 5. , 6. , 6. , 5. , 6. , 6. , 5. , 8. , 5. , 5. , 6. ,
        4. , 6. , 5. , 5. , 5. , 5. , 5. , 5. , 6. , 4. , 5. , 6. , 5. ,
        5. , 5. , 6. , 5. , 5. , 5. , 5. , 1. , 7. , 5. , 6. , 4.5, 7. ,
        5. , 4. , 6.5, 6.5, 6. , 4. , 5. , 6. , 6. , 6. , 6. , 5. , 5. ,
        4. , 4. ])]
In [59]:
a=median_wealht_pivot.values
b=median_wealht_pivot.columns
a = [int(median_wealht_pivot[i]) for i in b]
median_wealht_per_state = {'ESTADOS':b,'WEALTH_MEDIAN':a}
median_wealht_per_state=pd.DataFrame(median_wealht_per_state)
In [60]:
h=[]
NA3=list(data['WEALTH2'].isna())
for i in range(0,len(data['WEALTH2'])):
    if NA3[i]==True:
        for j in range(0,len(median_wealht_per_state)):
            if median_wealht_per_state['ESTADOS'][j] == data['STATE'][i]:
                k = (median_wealht_per_state['WEALTH_MEDIAN'][j])
                h.append(k)
    ver4= data['STATE'][i]=='DC'
    if NA3[i]==False or ver4==True:
        J=data['WEALTH2'][i]
        h.append(J)
data['WEALTH2']=h
data['WEALTH2'].isna().value_counts()
Out[60]:
False    95405
True         1
Name: WEALTH2, dtype: int64
In [61]:
data.loc[data['WEALTH2'].isnull()]
Out[61]:
ODATEDW TCODE STATE INCOME GENDER WEALTH1 MALEMILI MALEVET VIETVETS WWIIVETS ... RFA_2F RFA_2A donor_resp_maill_offer Pre_donor_interest_collecting donor_interest_collecting donor_have_child_y_n urban_city_level social_economical_status Age Group_age
5237 2016-01-01 0 DC NaN F NaN 0 14 24 24 ... 1 F None 0 no yes Urban Highest SES 39 Age 35-44

1 rows × 419 columns

NOTE: After this stage we noticed that one case remained null. This happens because it is unique donors in DC. Because the wealth is calculate diferentely in each state and We also noticed that most variables had no consistence for future analysis, so we decided to drop this observation (CONTROLN:92970, index: 5237)
In [62]:
data=data.drop([5237],axis=0).reset_index(drop=True)
In [63]:
data['WEALTH2'].isna().value_counts()
Out[63]:
False    95405
Name: WEALTH2, dtype: int64
Dropping variable 'INCOME','WEALTH1'

After using the income to fill some missing cases on wealth 2 we decided to drop due to the variable have too many missing cases (21286) and have only Seven possible values to income (0 to 7). This variable does not provide any information for good interpretation. The variables related to income from the donor’s neighbourhood provide Better information with good quality.

In [64]:
data=data.drop(columns=['INCOME','WEALTH1'])

C: 3rd Transformation and filling Missing cases: Variable: "Gender"

In this step we are going transform and filling missing cases on variable Gender using the following steps:

  1. We are going to replace all the values different from M-male and F-female with standard Missing values:
  2. We are going to use the variable T-code to fill the missing cases: • The variable T-code refers to the donor title where all the code 1, 4, 6, 9, 13, 14, 18 : suggest that the donor is a Male and code 2,3, 22, 28, 72, 116, 1002, 4002, 13002, 14002, 17002, 28028, 72002 : suggest that the donor is a Female;
  3. If we continue with missing cases, we are going to use the variables of the donors neighbourhood, namely: • POP90C4: Percent Male; • POP90C5: Percent Female. • Rule to be applied:
    i.  If <span style="color:red"> POP90C4> POP90C5 the donor will be considered Male </span>;
    ii. If <span style="color:red"> Else the donor will be considered Female </span>;.

C.1: Step 1: Code to replace all the values different from M-male and F-female with standard Missing values.

In [65]:
data['GENDER'].value_counts() #counting all the values in the column Gender;
data['GENDER']=data['GENDER'].replace(' ', np.NaN) #replacing all the blank spaces with missing cases;
data['GENDER']=data['GENDER'].replace('U', np.NaN) #replacing all the U values with missing cases;
data['GENDER']=data['GENDER'].replace('J', np.NaN) #replacing all the J values with missing cases;
data['GENDER']=data['GENDER'].replace('C', np.NaN) #replacing all the C values with missing cases;
data['GENDER']=data['GENDER'].replace('A', np.NaN) #replacing all the A values with missing cases;
data['GENDER'].isna().value_counts() # Counting Missing cases
Out[65]:
False    90364
True      5041
Name: GENDER, dtype: int64

C.2: Step 2: Using T-code: T-code refers to the donor title where all the code 1, 4, 6, 9, 13, 14, 18 : suggest that the donor is a Male and code 2,3, 22, 28, 72, 116, 1002, 4002, 13002, 14002, 17002, 28028, 72002 : suggest that the donor is a Female;

In [66]:
# First lets fill all the Missing cases with U = Unknown
data["GENDER"].fillna("U", inplace = True)
In [67]:
# Second lets fill all the possibles U cases using the T-code
b=[]
male=[1, 4, 6, 9, 13, 14, 18]
female= [2,3, 22, 28, 72, 116, 1002, 4002, 13002, 14002, 17002, 28028, 72002]

for i in range(0,len(data)):
    if data['GENDER'][i]=='U' and data["TCODE"][i] in male:
        b.append("M") 
    elif data['GENDER'][i]=='U' and data["TCODE"][i] in female:
        b.append("F")
    else:
        b.append(data['GENDER'][i])
data['GENDER']=b

At the begginig we had 5041 unknown cases in gender. With step 2 we reduced this number to 2940. Now lets apply the 3rd step

C.3: Step 3: Using the variables of the donors neighbourhood, namely:

•   POP90C4: Percent Male;
•   POP90C5: Percent Female.
•   Rule to be applied:
    i.  If POP90C4> POP90C5 the donor will be considered Male;
    ii. Else the donor will be considered Female;.
In [68]:
b=[]
for i in range(0,len(data)):
    if data['GENDER'][i]=='U' and data["POP90C4"][i] > data["POP90C5"][i]:
        b.append("M") 
    elif data['GENDER'][i]=='U' and data["POP90C4"][i] < data["POP90C5"][i]:
        b.append("F")
    else:
        b.append(data['GENDER'][i])
data['GENDER']=b
data['GENDER'].value_counts()
Out[68]:
F    54630
M    40173
U      602
Name: GENDER, dtype: int64

At step 2 we had 2940 unknown cases in gender. With step 3 we reduced this number to 602.

D: Computing new variables: Variable: "DONOR_TYPE"

Now we are going to calculate the distance (in months) since last gist and last promotion was emailed to every donor in the dataset: •LASTDATE represents the date of the last gift per donor; •ADATE_2 represents the date when the last promotion was emailed to every donor in the dataset (17NK).

we are going to classify every donor according with following the criteria below:

• A=ACTIVE DONOR: Anyone who made their last donation at least 12 months ago before the email of the last promotion;

• L=LAPSING DONOR: Anyone who made their last donation between 13-24 months ago before the email of the last promotion;

• I=INACTIVE DONOR: Anyone who made their last donation 25+ months ago before the email of the last promotion.

In [69]:
g=map(lambda x: str(x), data['LASTDATE'])
last_gift=list(g)
year_last_gift=[]
month_last_gift=[]
for i in last_gift:
    x=i.split('-')[0]
    year_last_gift.append(x)
    y=i.split('-')[1]
    month_last_gift.append(y)
#year_last_gift represents the year of th last gift per donor
#month_last_gift represents the month of the last gift per donor
In [70]:
data["month_of_last_gift"]=month_last_gift
data["month_of_last_gift"]=data["month_of_last_gift"].astype(int)
In [71]:
d=map(lambda x: str(x), data['ADATE_2'])
last_mail=list(d)
year_last_email=[]
month_last_email=[]
for i in last_mail:
    x=i.split('-')[0]
    year_last_email.append(x)
    y=i.split('-')[1]
    month_last_email.append(y)
#year_last_email represents the year of the last promotion sent
#month_last_email represents the month of the last promotion sent
In [72]:
year_last_email = list(map(int, year_last_email))
month_last_email= list(map(int, month_last_email))
recency_lastdate_adate2=[]
difference_year2m=[]
difference_m=[]
for i in range(0,len(data['ADATE_2'])):
    x = (int(year_last_email[i])-int(year_last_gift[i]))*12
    difference_year2m.append(x)
    y = int(month_last_email[i])-int(month_last_gift[i])
    difference=x+y
    recency_lastdate_adate2.append(difference)
#creates a list that stores the difference in months between last gift and last email
data["months_lastgift"]=recency_lastdate_adate2
In [73]:
ç=[]
for i in recency_lastdate_adate2:
    if i <= 12:
        q='ACTIVE DONOR'
        ç.append(q)
    if 12 < i <= 24:
        w='LAPSING DONOR'
        ç.append(w)
    if i > 24:
        t='INACTIVE DONOR'
        ç.append(t)
In [74]:
data['DONOR_TYPE']=ç
data['DONOR_TYPE'].value_counts()
Out[74]:
LAPSING DONOR     84125
INACTIVE DONOR     7315
ACTIVE DONOR       3965
Name: DONOR_TYPE, dtype: int64

D: Computing two new variables: Variable: "month_largest_gift" and "month_of_minimum_gift"

In [75]:
b=map(lambda x: str(x),data['MAXRDATE'])
largest_gift=list(b)
month_largest_gift=[]
for i in largest_gift:
    y=i.split('-')[1]
    month_largest_gift.append(y)
In [76]:
data["month_largest_gift"]=month_largest_gift
data["month_largest_gift"]=data["month_largest_gift"].astype(int)
In [77]:
b=map(lambda x: str(x),data['MINRDATE'])
minimum_gift=list(b)
month_minimum_gift=[]
for i in minimum_gift:
    y=i.split('-')[1]
    month_minimum_gift.append(y)
In [78]:
data["month_minimum_gift"]=month_minimum_gift
data["month_minimum_gift"]=data["month_minimum_gift"].astype(int)

Our dataset contains a lot of variables lets select only the variables that we consider important for this study.

In [79]:
data1=data.copy()
In [80]:
# Set CONTROLN as index
data1=data1.set_index("CONTROLN")

Lets filter the data set according with the DONOR_TYPE

In [81]:
# Creating a daset for lapsed Donor
datasetlapsed=data1.loc[data1["DONOR_TYPE"]=="LAPSING DONOR"]
# Creating a daset for Active Donor
datasetactive=data1.loc[data1["DONOR_TYPE"]=="ACTIVE DONOR"]
# Creating a daset for Inactive Donor
datasetinactive=data1.loc[data1["DONOR_TYPE"]=="INACTIVE DONOR"]

Lets define metric features for clusters

In [82]:
metric_features=["RAMNTALL","MINRAMNT", "MAXRAMNT","IC5", "month_of_last_gift",\
                 "month_minimum_gift", "month_largest_gift", "WEALTH2", "IC1", \
                 "IC2","IC3","IC4", "AVGGIFT", "months_lastgift"]
In [83]:
# Prepare figure
fig = plt.figure(figsize=(12, 10))

# Obtain correlation matrix. Round the values to 2 decimal cases. Use the DataFrame corr() and round() method.
corr = np.round(datasetlapsed[metric_features].corr(method="pearson"), decimals=2)

# Build annotation matrix (values above |0.5| will appear annotated in the plot)
mask_annot = np.absolute(corr.values) >= 0.5
annot = np.where(mask_annot, corr.values, np.full(corr.shape,"")) # Try to understand what this np.where() does
matrix = np.triu(datasetlapsed[metric_features].corr())
# Plot heatmap of the correlation matrix
sns.heatmap(data=corr, annot=annot, mask=matrix, cmap=sns.diverging_palette(220, 10, as_cmap=True), 
            fmt='s', vmin=-1, vmax=1, center=0, square=True, linewidths=.5)

# Layout
fig.subplots_adjust(top=0.95)
#fig.suptitle("Correlation Matrix", fontsize=20)


plt.savefig(os.path.join('Correlation_matrix.png'), dpi=300)
plt.show()
locator: <matplotlib.colorbar._ColorbarAutoLocator object at 0x000001845B411F40>
Using auto colorbar locator on colorbar
locator: <matplotlib.colorbar._ColorbarAutoLocator object at 0x000001845B411F40>
Setting pcolormesh
findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=11.0.
findfont: score(<Font 'DejaVu Sans' (DejaVuSans-BoldOblique.ttf) oblique normal 700 normal>) = 3.335
findfont: score(<Font 'cmss10' (cmss10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXNonUnicode' (STIXNonUniBolIta.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'cmsy10' (cmsy10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeFourSym' (STIXSizFourSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Sans' (DejaVuSans.ttf) normal normal 400 normal>) = 2.05
findfont: score(<Font 'cmex10' (cmex10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'cmmi10' (cmmi10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeOneSym' (STIXSizOneSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'cmb10' (cmb10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeTwoSym' (STIXSizTwoSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'STIXSizeThreeSym' (STIXSizThreeSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'cmr10' (cmr10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXGeneral' (STIXGeneralBolIta.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'STIXSizeTwoSym' (STIXSizTwoSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Sans Display' (DejaVuSansDisplay.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeFourSym' (STIXSizFourSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'STIXSizeOneSym' (STIXSizOneSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'STIXSizeFiveSym' (STIXSizFiveSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXNonUnicode' (STIXNonUni.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'cmtt10' (cmtt10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'DejaVu Sans' (DejaVuSans-Oblique.ttf) oblique normal 400 normal>) = 3.05
findfont: score(<Font 'STIXSizeThreeSym' (STIXSizThreeSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'STIXNonUnicode' (STIXNonUniIta.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'DejaVu Sans' (DejaVuSans-Bold.ttf) normal normal 700 normal>) = 2.335
findfont: score(<Font 'STIXGeneral' (STIXGeneralItalic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'STIXGeneral' (STIXGeneralBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono-BoldOblique.ttf) oblique normal 700 normal>) = 11.335
findfont: score(<Font 'STIXGeneral' (STIXGeneral.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Serif Display' (DejaVuSerifDisplay.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXNonUnicode' (STIXNonUniBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono-Oblique.ttf) oblique normal 400 normal>) = 11.05
findfont: score(<Font 'Arial Nova' (ArialNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Rounded MT Bold' (ARLRDBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Century Schoolbook' (SCHLBKI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Rockwell Condensed' (ROCC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Arial' (ariblk.ttf) normal normal black normal>) = 0.525
findfont: score(<Font 'Century Schoolbook' (SCHLBKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI' (segoeui.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Showcard Gothic' (SHOWG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell' (ROCKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial' (ARIALN.TTF) normal normal 400 condensed>) = 0.25
findfont: score(<Font 'Kristen ITC' (ITCKRIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Mistral' (MISTRAL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Cambria' (cambriai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEO.TTF) oblique normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Kristen ITC' (ITCKRIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee UI' (LeelawUI.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bell MT' (BELLB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Demi' (FRADMIT.TTF) italic normal demi normal>) = 11.24
findfont: score(<Font 'Ink Free' (Inkfree.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee' (LEELAWDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans Nova' (GillSansUltraBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Forte' (FORTE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Himalaya' (himalaya.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Broadway' (BROADW.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Segoe UI' (segoeuiz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Goudy Old Style' (GOUDOS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Engravers MT' (ENGR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Bodoni MT' (BOD_PSTC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Copperplate Gothic Bold' (COPRGTB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Segoe UI' (segoeuib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Constantia' (constan.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Rounded MT Bold' (ARLRDBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEBO.TTF) oblique normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Fax' (LFAXDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Tw Cen MT' (TCB_____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_CR.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Courier New' (courbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Tahoma' (tahomabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_R.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Broadway' (BROADW.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft JhengHei' (msjhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Arial' (ARIALNB.TTF) normal normal 700 condensed>) = 0.5349999999999999
findfont: score(<Font 'Rockwell Extra Bold' (ROCKEB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Lucida Bright' (LBRITEDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Century Gothic' (GOTHIC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Palatino Linotype' (palab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia' (georgiab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Candara' (Candarai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Eras Bold ITC' (ERASBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Script MT Bold' (SCRIPTBL.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Berlin Sans FB' (BRLNSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Yu Gothic' (YuGothM.ttc) normal normal medium normal>) = 10.145
findfont: score(<Font 'Palatino Linotype' (palai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Sitka Small' (SitkaI.ttc) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Bodoni MT' (BOD_CBI.TTF) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Informal Roman' (INFROMAN.TTF) normal normal roman normal>) = 10.145
findfont: score(<Font 'Bell MT' (BELL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Courier New' (cour.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Edwardian Script ITC' (ITCEDSCR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Onyx' (ONYX.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANS.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Corbel' (corbelli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Webdings' (webdings.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Vladimir Script' (VLADIMIR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe Print' (segoepr.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondUltraBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Palatino Linotype' (palab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Corbel' (corbel.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Javanese Text' (javatext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Goudy Old Style' (GOUDOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tw Cen MT Condensed' (TCCM____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Bahnschrift' (bahnschrift.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Felix Titling' (FELIXTI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (arial.ttf) normal normal 400 normal>) = 0.05
findfont: score(<Font 'Berlin Sans FB' (BRLNSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Demi Cond' (FRADMCN.TTF) normal normal demi condensed>) = 10.44
findfont: score(<Font 'Gabriola' (Gabriola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gadugi' (gadugib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'HoloLens MDL2 Assets' (holomdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANSDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Lucida Bright' (LBRITED.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Matura MT Script Capitals' (MATURASC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft JhengHei' (msjhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Niagara Engraved' (NIAGENG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Impact' (impact.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Dubai' (DUBAI-REGULAR.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Gill Sans MT Ext Condensed Bold' (GLSNECB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Consolas' (consolab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Times New Roman' (timesbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Goudy Old Style' (GOUDOS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Gothic' (GOTHICI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft YaHei' (msyh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHV.TTF) normal normal heavy normal>) = 10.43
findfont: score(<Font 'Berlin Sans FB' (BRLNSR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Microsoft YaHei' (msyhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Arial Nova' (ArialNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Haettenschweiler' (HATTEN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans MT Condensed' (GILC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Calisto MT' (CALISTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'High Tower Text' (HTOWERT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (Sitka.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Cooper Black' (COOPBL.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Yu Gothic' (YuGothL.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'MingLiU-ExtB' (mingliub.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Trebuchet MS' (trebuc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (ARIALNI.TTF) italic normal 400 condensed>) = 1.25
findfont: score(<Font 'Dubai' (DUBAI-BOLD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Palatino Linotype' (pala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'MS Outlook' (OUTLOOK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI Historic' (seguihis.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Magneto' (MAGNETOB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BLAR.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Gill Sans Ultra Bold' (GILSANUB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Nirmala UI' (NirmalaB.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Yu Gothic' (YuGothB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Bernard MT Condensed' (BERNHC.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Candara' (Candaraz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Sans' (LSANSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Colonna MT' (COLONNA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguisli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Poor Richard' (POORICH.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (timesbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Century Gothic' (GOTHIC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'OCR A Extended' (OCRAEXT.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Courier New' (courbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Colonna MT' (COLONNA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell' (ROCK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Condensed' (ROCCB___.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'MV Boli' (mvboli.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Fax' (LFAXI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe UI' (segoeui.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bell MT' (BELLI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft YaHei' (msyhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Mistral' (MISTRAL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Calibri' (calibriz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Juice ITC' (JUICE___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CR.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Segoe UI Emoji' (seguiemj.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Centaur' (CENTAUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (SitkaI.ttc) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Bodoni MT' (BOD_B.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_I.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Dubai' (DUBAI-LIGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Comic Sans MS' (comic.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbelz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'MS Reference Sans Serif' (REFSAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Algerian' (ALGER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (arialbi.ttf) italic normal 700 normal>) = 1.335
findfont: score(<Font 'Arial Nova' (ArialNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Cambria' (cambriab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Candara' (Candaral.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Rockwell Nova' (RockwellNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Bodoni MT' (BOD_PSTC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comici.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Chiller' (CHILLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Courier New' (couri.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft New Tai Lue' (ntailub.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Demi' (FRADMIT.TTF) italic normal demi normal>) = 11.24
findfont: score(<Font 'Berlin Sans FB Demi' (BRLNSDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Garamond' (GARABD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Trebuchet MS' (trebucit.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Candara' (Candarali.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Microsoft Tai Le' (taile.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Freestyle Script' (FREESCPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Yu Gothic' (YuGothR.ttc) normal normal regular normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (BKANT.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Cambria' (cambria.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'MT Extra' (MTEXTRA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Goudy Old Style' (GOUDOSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Stencil' (STENCIL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Condensed' (ROCC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Perpetua' (PER_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Matura MT Script Capitals' (MATURASC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'SimSun' (simsun.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (ANTQUABI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana' (verdana.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Malgun Gothic' (malgun.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'High Tower Text' (HTOWERTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (ARIALNB.TTF) normal normal 700 condensed>) = 0.5349999999999999
findfont: score(<Font 'Bell MT' (BELLB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Bell MT' (BELL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Cambria' (cambria.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed' (TCCB____.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Elephant' (ELEPHNT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Castellar' (CASTELAR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tw Cen MT' (TCM_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Constantia' (constan.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansItNova.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Rockwell Nova' (RockwellNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Freestyle Script' (FREESCPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tempus Sans ITC' (TEMPSITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Playbill' (PLAYBILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (ANTQUAI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Calisto MT' (CALISTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Parchment' (PARCHM.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Curlz MT' (CURLZ___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Onyx' (ONYX.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Kunstler Script' (KUNSTLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbeli.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Cambria' (cambriaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Segoe Print' (segoeprb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Bahnschrift' (bahnschrift.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium' (framdit.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-66MdIt.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Goudy Old Style' (GOUDOSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Californian FB' (CALIFB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MS Reference Sans Serif' (REFSAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gadugi' (gadugi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANSD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia' (georgiaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Jokerman' (JOKERMAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHVIT.TTF) italic normal heavy normal>) = 11.43
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Calibri' (calibrib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft YaHei' (msyh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Demi' (FRADM.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Segoe UI Emoji' (seguiemj.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Niagara Solid' (NIAGSOL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium' (framd.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Constantia' (constanz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Snap ITC' (SNAP____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Garamond' (GARABD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Calisto MT' (CALISTB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Yu Gothic' (YuGothL.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Bradley Hand ITC' (BRADHITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Courier New' (couri.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'SimSun-ExtB' (simsunb.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_BLAR.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Arial' (arialbd.ttf) normal normal 700 normal>) = 0.33499999999999996
findfont: score(<Font 'Papyrus' (PAPYRUS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Baskerville Old Face' (BASKVILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Calligraphy' (LCALLIG.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe UI' (segoeuii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Tahoma' (tahomabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Javanese Text' (javatext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Viner Hand ITC' (VINERITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Nova' (ArialNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Leelawadee UI' (LeelUIsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Bookshelf Symbol 7' (BSSYM7.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Consolas' (consolab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Eras Light ITC' (ERASLGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Myanmar Text' (mmrtextb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Sans Unicode' (l_10646.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Snap ITC' (SNAP____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Handwriting' (LHANDW.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Fax' (LFAXDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Nirmala UI' (NirmalaB.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Ebrima' (ebrimabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft Yi Baiti' (msyi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHVIT.TTF) italic normal heavy normal>) = 11.43
findfont: score(<Font 'Segoe UI' (seguisb.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Gill Sans Nova' (GillSansBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Bauhaus 93' (BAUHS93.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Console' (lucon.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Vivaldi' (VIVALDII.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Calibri' (calibri.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Elephant' (ELEPHNT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Vivaldi' (VIVALDII.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHV.TTF) normal normal heavy normal>) = 10.43
findfont: score(<Font 'Franklin Gothic Demi' (FRADM.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Agency FB' (AGENCYB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tahoma' (tahoma.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Handwriting' (LHANDW.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Century Schoolbook' (SCHLBKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Agency FB' (AGENCYR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Californian FB' (CALIFI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Calisto MT' (CALIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Elephant' (ELEPHNTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'OCR A Extended' (OCRAEXT.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (ARIALNBI.TTF) italic normal 700 condensed>) = 1.535
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-65Md.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Curlz MT' (CURLZ___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Showcard Gothic' (SHOWG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Eras Medium ITC' (ERASMD.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Segoe UI Symbol' (seguisym.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Calisto MT' (CALISTB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-66MdIt.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Tw Cen MT' (TCM_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguisbi.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Old English Text MT' (OLDENGL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (ARIALNI.TTF) italic normal 400 condensed>) = 1.25
findfont: score(<Font 'Malgun Gothic' (malgunsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Myanmar Text' (mmrtext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Himalaya' (himalaya.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee UI' (LeelaUIb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Monotype Corsiva' (MTCORSVA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Perpetua' (PERB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Chiller' (CHILLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calisto MT' (CALISTBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Haettenschweiler' (HATTEN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_B.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial Nova' (ArialNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_CBI.TTF) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Bodoni MT' (BOD_R.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia' (georgia.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CI.TTF) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Gill Sans MT' (GIL_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gadugi' (gadugi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee UI' (LeelUIsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-55Rg.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comicbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Sitka Small' (SitkaB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-55Rg.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Candara' (Candarab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'MS Outlook' (OUTLOOK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (arial.ttf) normal normal 400 normal>) = 0.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Mongolian Baiti' (monbaiti.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbel.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Calibri' (calibrii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Myanmar Text' (mmrtextb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans MT' (GILB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Agency FB' (AGENCYR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calisto MT' (CALISTBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Niagara Solid' (NIAGSOL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Copperplate Gothic Light' (COPRGTL.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPE.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_BI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans MT' (GILI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Perpetua' (PER_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Harrington' (HARNGTON.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana' (verdanai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansLightItNova.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Gill Sans Ultra Bold Condensed' (GILLUBCD.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Segoe UI' (seguibli.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Niagara Engraved' (NIAGENG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuisl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Dubai' (DUBAI-MEDIUM.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Rockwell' (ROCKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Sans' (LSANSD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Imprint MT Shadow' (IMPRISHA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT' (TCMI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Sitka Small' (SitkaB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Comic Sans MS' (comicz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Poor Richard' (POORICH.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Fax' (LFAXI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Wingdings 2' (WINGDNG2.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Century Gothic' (GOTHICBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Engravers MT' (ENGR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Ravie' (RAVIE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Brush Script MT' (BRUSHSCI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe Print' (segoepr.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguibl.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Jokerman' (JOKERMAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT' (GILB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Times New Roman' (timesi.ttf) italic normal roman normal>) = 11.145
findfont: score(<Font 'Sylfaen' (sylfaen.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_CI.TTF) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Lucida Fax' (LFAX.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondUltraBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Playbill' (PLAYBILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'French Script MT' (FRSCRIPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Wingdings 3' (WINGDNG3.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (timesbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Agency FB' (AGENCYB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Calligraphy' (LCALLIG.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Courier New' (cour.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT' (TCBI____.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Arial' (ariblk.ttf) normal normal black normal>) = 0.525
findfont: score(<Font 'Viner Hand ITC' (VINERITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Modern No. 20' (MOD20.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOS.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Ebrima' (ebrima.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (Sitka.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Tai Le' (taile.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Pristina' (PRISTINA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Imprint MT Shadow' (IMPRISHA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Forte' (FORTE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansItNova.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Harlow Solid Italic' (HARLOWSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Malgun Gothic' (malgunbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Harlow Solid Italic' (HARLOWSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Perpetua' (PERBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Fax' (LFAXD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Nirmala UI' (NirmalaS.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Copperplate Gothic Bold' (COPRGTB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Console' (lucon.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Consolas' (consolai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia' (georgiab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Ravie' (RAVIE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Constantia' (constani.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia' (georgiai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Comic Sans MS' (comicbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Malgun Gothic' (malgunsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEBO.TTF) oblique normal 700 normal>) = 11.335
findfont: score(<Font 'High Tower Text' (HTOWERTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft JhengHei' (msjhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Californian FB' (CALIFI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Dubai' (DUBAI-REGULAR.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comic.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Constantia' (constanz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (SitkaZ.ttc) italic normal 700 normal>) = 11.335
findfont: score(<Font 'MS Reference Specialty' (REFSPCL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Berlin Sans FB Demi' (BRLNSDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MS Gothic' (msgothic.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (times.ttf) normal normal roman normal>) = 10.145
findfont: score(<Font 'Castellar' (CASTELAR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT' (GILBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Modern No. 20' (MOD20.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Extra Bold' (ROCKEB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Trebuchet MS' (trebucbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Century Schoolbook' (SCHLBKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Book' (FRABKIT.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansUltraBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell' (ROCKI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe Script' (segoesc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansLightNova.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Arial Nova' (ArialNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-65Md.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Gill Sans Nova' (GillSansLightItNova.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Calibri' (calibril.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Britannic Bold' (BRITANIC.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Gill Sans MT' (GILBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Ebrima' (ebrimabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Constantia' (constanb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Candara' (Candarali.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Franklin Gothic Medium' (framdit.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Palatino Linotype' (pala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Candara' (Candarab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Marlett' (marlett.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed' (TCCB____.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Times New Roman' (timesi.ttf) italic normal roman normal>) = 11.145
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Comic Sans MS' (comicz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-76BdIt.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'MT Extra' (MTEXTRA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Wide Latin' (LATINWD.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Segoe MDL2 Assets' (segmdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft New Tai Lue' (ntailub.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Calisto MT' (CALIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Cambria' (cambriab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Consolas' (consolaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana' (verdanab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Cooper Black' (COOPBL.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Constantia' (constani.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft Sans Serif' (micross.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calibri' (calibrib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe Script' (segoesc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bauhaus 93' (BAUHS93.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'SimSun' (simsun.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Segoe UI Symbol' (seguisym.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'High Tower Text' (HTOWERT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Garamond' (GARAIT.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans MT Condensed' (GILC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'SimSun-ExtB' (simsunb.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Consolas' (consolaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Yu Gothic' (YuGothB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Leelawadee UI' (LeelaUIb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft JhengHei' (msjh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOS.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Microsoft PhagsPa' (phagspa.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Parchment' (PARCHM.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Californian FB' (CALIFR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Nova' (ArialNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe MDL2 Assets' (segmdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century' (CENTURY.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Wingdings 3' (WINGDNG3.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguisbi.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Blackadder ITC' (ITCBLKAD.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Trebuchet MS' (trebuc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Garamond' (GARA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bradley Hand ITC' (BRADHITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Magneto' (MAGNETOB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Kunstler Script' (KUNSTLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans Unicode' (l_10646.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana' (verdana.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Calibri' (calibril.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Webdings' (webdings.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuil.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'MV Boli' (mvboli.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Leelawadee UI' (LeelawUI.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Palace Script MT' (PALSCRI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (times.ttf) normal normal roman normal>) = 10.145
findfont: score(<Font 'Felix Titling' (FELIXTI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Eras Medium ITC' (ERASMD.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Gill Sans MT' (GIL_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Juice ITC' (JUICE___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Constantia' (constanb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Cambria' (cambriaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Candara' (Candaraz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft Sans Serif' (micross.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Trebuchet MS' (trebucbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft New Tai Lue' (ntailu.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Blackadder ITC' (ITCBLKAD.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Brush Script MT' (BRUSHSCI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Corbel' (corbeli.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Pristina' (PRISTINA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Garamond' (GARA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Bright' (LBRITEI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Bright' (LBRITE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gabriola' (Gabriola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana' (verdanab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Gill Sans Nova' (GillSansLightNova.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Georgia' (georgiai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe UI' (seguibli.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Segoe Script' (segoescb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell' (ROCKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gadugi' (gadugib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft JhengHei' (msjhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Goudy Old Style' (GOUDOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Ebrima' (ebrima.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Franklin Gothic Book' (FRABKIT.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Arial Nova' (ArialNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'Lucida Bright' (LBRITEI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Myanmar Text' (mmrtext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Yu Gothic' (YuGothM.ttc) normal normal medium normal>) = 10.145
findfont: score(<Font 'Trebuchet MS' (trebucit.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Franklin Gothic Demi Cond' (FRADMCN.TTF) normal normal demi condensed>) = 10.44
findfont: score(<Font 'Palatino Linotype' (palabi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-75Bd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Wingdings' (wingding.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbelz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Britannic Bold' (BRITANIC.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Segoe UI' (segoeuii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft YaHei' (msyhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Franklin Gothic Medium' (framd.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Maiandra GD' (MAIAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Courier New' (courbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial' (ARIALN.TTF) normal normal 400 condensed>) = 0.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Bookman Old Style' (BOOKOSI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Tw Cen MT Condensed' (TCCM____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Eras Bold ITC' (ERASBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Rage Italic' (RAGE.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Calibri' (calibrii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Ultra Bold Condensed' (GILLUBCD.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Microsoft PhagsPa' (phagspab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans Nova' (GillSansNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Schoolbook' (SCHLBKI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Verdana' (verdanaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoItNova.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Candara' (Candarai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Baskerville Old Face' (BASKVILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-76BdIt.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Leelawadee' (LEELAWAD.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Rockwell' (ROCKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Eras Demi ITC' (ERASDEMI.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Segoe UI' (seguibl.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Californian FB' (CALIFB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tempus Sans ITC' (TEMPSITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Fax' (LFAX.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Eras Demi ITC' (ERASDEMI.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Corbel' (corbelb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Sitka Small' (SitkaZ.ttc) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rage Italic' (RAGE.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Ultra Bold' (GILSANUB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Wingdings' (wingding.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Footlight MT Light' (FTLTLT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Georgia' (georgiaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Nirmala UI' (Nirmala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium Cond' (FRAMDCN.TTF) normal normal medium condensed>) = 10.344999999999999
findfont: score(<Font 'Tw Cen MT' (TCMI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft Tai Le' (taileb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Candara' (Candaral.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Edwardian Script ITC' (ITCEDSCR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Nova' (ArialNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Dubai' (DUBAI-BOLD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BLAI.TTF) italic normal black normal>) = 11.525
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Calibri' (calibri.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-56It.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (arialbd.ttf) normal normal 700 normal>) = 0.33499999999999996
findfont: score(<Font 'Informal Roman' (INFROMAN.TTF) normal normal roman normal>) = 10.145
findfont: score(<Font 'Eras Light ITC' (ERASLGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Franklin Gothic Book' (FRABK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Wingdings 2' (WINGDNG2.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gigi' (GIGI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed Extra Bold' (TCCEB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Dubai' (DUBAI-LIGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Tw Cen MT' (TCBI____.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Cambria' (cambriai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Malgun Gothic' (malgunbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Mongolian Baiti' (monbaiti.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Bright' (LBRITE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Consolas' (consolai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-75Bd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Calibri' (calibriz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft JhengHei' (msjh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Yi Baiti' (msyi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoItNova.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Rockwell Nova' (RockwellNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Harrington' (HARNGTON.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Gill Sans Nova' (GillSansBoItNova.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Nirmala UI' (Nirmala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Corbel' (corbelli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Dubai' (DUBAI-MEDIUM.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Century Gothic' (GOTHICB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Bright' (LBRITEDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Palace Script MT' (PALSCRI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft PhagsPa' (phagspab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MingLiU-ExtB' (mingliub.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sylfaen' (sylfaen.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANS.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BLAI.TTF) italic normal black normal>) = 11.525
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century' (CENTURY.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbell.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'French Script MT' (FRSCRIPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-56It.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Book Antiqua' (ANTQUAI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Century Schoolbook' (CENSCBK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Lucida Bright' (LBRITED.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Leelawadee' (LEELAWAD.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT' (GILI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Leelawadee' (LEELAWDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI' (seguisb.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Garamond' (GARAIT.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Candara' (Candara.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Berlin Sans FB' (BRLNSR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (arialbi.ttf) italic normal 700 normal>) = 1.335
findfont: score(<Font 'Book Antiqua' (ANTQUAB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Courier New' (courbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Palatino Linotype' (palai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe Script' (segoescb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MS Reference Specialty' (REFSPCL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Verdana' (verdanai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Perpetua Titling MT' (PERTIBD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Wide Latin' (LATINWD.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Verdana' (verdanaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Century Gothic' (GOTHICI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Old English Text MT' (OLDENGL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium Cond' (FRAMDCN.TTF) normal normal medium condensed>) = 10.344999999999999
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Maiandra GD' (MAIAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT Ext Condensed Bold' (GLSNECB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gloucester MT Extra Condensed' (GLECB.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Yu Gothic' (YuGothR.ttc) normal normal regular normal>) = 10.05
findfont: score(<Font 'Ink Free' (Inkfree.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Schoolbook' (SCHLBKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Calibri' (calibrili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Segoe UI' (segoeuisl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Trebuchet MS' (trebucbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Perpetua Titling MT' (PERTILI.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Copperplate Gothic Light' (COPRGTL.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Script MT Bold' (SCRIPTBL.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Book Antiqua' (BKANT.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI Historic' (seguihis.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Book' (FRABK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comici.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Nirmala UI' (NirmalaS.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Trebuchet MS' (trebucbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'HoloLens MDL2 Assets' (holomdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Footlight MT Light' (FTLTLT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Lucida Sans' (LSANSDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gloucester MT Extra Condensed' (GLECB.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Corbel' (corbell.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Papyrus' (PAPYRUS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (ARIALNBI.TTF) italic normal 700 condensed>) = 1.535
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEO.TTF) oblique normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'Book Antiqua' (ANTQUABI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Georgia' (georgia.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CB.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Century Gothic' (GOTHICBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Consolas' (consola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Centaur' (CENTAUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbelb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Century Gothic' (GOTHICB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft PhagsPa' (phagspa.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Symbol' (symbol.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calibri' (calibrili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Arial Nova' (ArialNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Lucida Sans' (LSANSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Consolas' (consola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CB.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Arial' (ariali.ttf) italic normal 400 normal>) = 1.05
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Goudy Stout' (GOUDYSTO.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Symbol' (symbol.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (ANTQUAB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI' (seguisli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Malgun Gothic' (malgun.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gigi' (GIGI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed Extra Bold' (TCCEB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Candara' (Candara.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bell MT' (BELLI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Elephant' (ELEPHNTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Vladimir Script' (VLADIMIR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT' (TCB_____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft Tai Le' (taileb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Condensed' (ROCCB___.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Bodoni MT' (BOD_I.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansBoItNova.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Bernard MT Condensed' (BERNHC.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Rockwell' (ROCK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tahoma' (tahoma.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Stencil' (STENCIL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuil.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Microsoft New Tai Lue' (ntailu.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Impact' (impact.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell' (ROCKI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Fax' (LFAXD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial' (ariali.ttf) italic normal 400 normal>) = 1.05
findfont: score(<Font 'Segoe UI' (segoeuiz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua Titling MT' (PERTILI.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Microsoft YaHei' (msyhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Times New Roman' (timesbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPE.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'MS Gothic' (msgothic.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Segoe Print' (segoeprb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Goudy Stout' (GOUDYSTO.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua Titling MT' (PERTIBD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Monotype Corsiva' (MTCORSVA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Californian FB' (CALIFR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Schoolbook' (CENSCBK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Bookshelf Symbol 7' (BSSYM7.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Algerian' (ALGER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Palatino Linotype' (palabi.ttf) italic normal 700 normal>) = 11.335
findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=11.0 to Arial ('C:\\windows\\Fonts\\arial.ttf') with score of 0.050000.
findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0.
findfont: score(<Font 'DejaVu Sans' (DejaVuSans-BoldOblique.ttf) oblique normal 700 normal>) = 3.335
findfont: score(<Font 'cmss10' (cmss10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXNonUnicode' (STIXNonUniBolIta.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'cmsy10' (cmsy10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeFourSym' (STIXSizFourSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Sans' (DejaVuSans.ttf) normal normal 400 normal>) = 2.05
findfont: score(<Font 'cmex10' (cmex10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'cmmi10' (cmmi10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeOneSym' (STIXSizOneSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'cmb10' (cmb10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeTwoSym' (STIXSizTwoSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'STIXSizeThreeSym' (STIXSizThreeSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'cmr10' (cmr10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXGeneral' (STIXGeneralBolIta.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'STIXSizeTwoSym' (STIXSizTwoSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Sans Display' (DejaVuSansDisplay.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXSizeFourSym' (STIXSizFourSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'STIXSizeOneSym' (STIXSizOneSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'STIXSizeFiveSym' (STIXSizFiveSymReg.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXNonUnicode' (STIXNonUni.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'cmtt10' (cmtt10.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'DejaVu Sans' (DejaVuSans-Oblique.ttf) oblique normal 400 normal>) = 3.05
findfont: score(<Font 'STIXSizeThreeSym' (STIXSizThreeSymBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'STIXNonUnicode' (STIXNonUniIta.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'DejaVu Sans' (DejaVuSans-Bold.ttf) normal normal 700 normal>) = 2.335
findfont: score(<Font 'STIXGeneral' (STIXGeneralItalic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'STIXGeneral' (STIXGeneralBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Serif' (DejaVuSerif-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono-BoldOblique.ttf) oblique normal 700 normal>) = 11.335
findfont: score(<Font 'STIXGeneral' (STIXGeneral.ttf) normal normal regular normal>) = 10.05
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Serif Display' (DejaVuSerifDisplay.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'STIXNonUnicode' (STIXNonUniBol.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'DejaVu Sans Mono' (DejaVuSansMono-Oblique.ttf) oblique normal 400 normal>) = 11.05
findfont: score(<Font 'Arial Nova' (ArialNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Rounded MT Bold' (ARLRDBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Century Schoolbook' (SCHLBKI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Rockwell Condensed' (ROCC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Arial' (ariblk.ttf) normal normal black normal>) = 0.525
findfont: score(<Font 'Century Schoolbook' (SCHLBKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI' (segoeui.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Showcard Gothic' (SHOWG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell' (ROCKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial' (ARIALN.TTF) normal normal 400 condensed>) = 0.25
findfont: score(<Font 'Kristen ITC' (ITCKRIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Mistral' (MISTRAL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Cambria' (cambriai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEO.TTF) oblique normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Kristen ITC' (ITCKRIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee UI' (LeelawUI.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bell MT' (BELLB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Demi' (FRADMIT.TTF) italic normal demi normal>) = 11.24
findfont: score(<Font 'Ink Free' (Inkfree.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee' (LEELAWDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans Nova' (GillSansUltraBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Forte' (FORTE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Himalaya' (himalaya.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Broadway' (BROADW.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Segoe UI' (segoeuiz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Goudy Old Style' (GOUDOS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Engravers MT' (ENGR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Bodoni MT' (BOD_PSTC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Copperplate Gothic Bold' (COPRGTB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Segoe UI' (segoeuib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Constantia' (constan.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Rounded MT Bold' (ARLRDBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEBO.TTF) oblique normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Fax' (LFAXDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Tw Cen MT' (TCB_____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_CR.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Courier New' (courbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Tahoma' (tahomabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_R.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Broadway' (BROADW.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft JhengHei' (msjhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Arial' (ARIALNB.TTF) normal normal 700 condensed>) = 0.5349999999999999
findfont: score(<Font 'Rockwell Extra Bold' (ROCKEB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Lucida Bright' (LBRITEDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Century Gothic' (GOTHIC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Palatino Linotype' (palab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia' (georgiab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Candara' (Candarai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Eras Bold ITC' (ERASBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Script MT Bold' (SCRIPTBL.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Berlin Sans FB' (BRLNSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Yu Gothic' (YuGothM.ttc) normal normal medium normal>) = 10.145
findfont: score(<Font 'Palatino Linotype' (palai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Sitka Small' (SitkaI.ttc) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Bodoni MT' (BOD_CBI.TTF) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Informal Roman' (INFROMAN.TTF) normal normal roman normal>) = 10.145
findfont: score(<Font 'Bell MT' (BELL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Courier New' (cour.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Edwardian Script ITC' (ITCEDSCR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Onyx' (ONYX.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANS.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Corbel' (corbelli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Webdings' (webdings.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Vladimir Script' (VLADIMIR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe Print' (segoepr.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondUltraBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Palatino Linotype' (palab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Corbel' (corbel.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Javanese Text' (javatext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Goudy Old Style' (GOUDOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tw Cen MT Condensed' (TCCM____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Bahnschrift' (bahnschrift.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Felix Titling' (FELIXTI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (arial.ttf) normal normal 400 normal>) = 0.05
findfont: score(<Font 'Berlin Sans FB' (BRLNSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Demi Cond' (FRADMCN.TTF) normal normal demi condensed>) = 10.44
findfont: score(<Font 'Gabriola' (Gabriola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gadugi' (gadugib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'HoloLens MDL2 Assets' (holomdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANSDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Lucida Bright' (LBRITED.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Matura MT Script Capitals' (MATURASC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft JhengHei' (msjhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Niagara Engraved' (NIAGENG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Impact' (impact.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Dubai' (DUBAI-REGULAR.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Gill Sans MT Ext Condensed Bold' (GLSNECB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Consolas' (consolab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Times New Roman' (timesbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Goudy Old Style' (GOUDOS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Gothic' (GOTHICI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft YaHei' (msyh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHV.TTF) normal normal heavy normal>) = 10.43
findfont: score(<Font 'Berlin Sans FB' (BRLNSR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Microsoft YaHei' (msyhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Arial Nova' (ArialNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Haettenschweiler' (HATTEN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans MT Condensed' (GILC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Calisto MT' (CALISTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'High Tower Text' (HTOWERT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (Sitka.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Cooper Black' (COOPBL.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Yu Gothic' (YuGothL.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'MingLiU-ExtB' (mingliub.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Trebuchet MS' (trebuc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (ARIALNI.TTF) italic normal 400 condensed>) = 1.25
findfont: score(<Font 'Dubai' (DUBAI-BOLD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Palatino Linotype' (pala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'MS Outlook' (OUTLOOK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI Historic' (seguihis.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Magneto' (MAGNETOB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BLAR.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Gill Sans Ultra Bold' (GILSANUB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Nirmala UI' (NirmalaB.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Yu Gothic' (YuGothB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Bernard MT Condensed' (BERNHC.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Candara' (Candaraz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Sans' (LSANSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Colonna MT' (COLONNA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguisli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Poor Richard' (POORICH.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (timesbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Century Gothic' (GOTHIC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'OCR A Extended' (OCRAEXT.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Courier New' (courbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Colonna MT' (COLONNA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell' (ROCK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Condensed' (ROCCB___.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'MV Boli' (mvboli.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Fax' (LFAXI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe UI' (segoeui.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bell MT' (BELLI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft YaHei' (msyhl.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Mistral' (MISTRAL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Calibri' (calibriz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Juice ITC' (JUICE___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CR.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Segoe UI Emoji' (seguiemj.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Centaur' (CENTAUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (SitkaI.ttc) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Bodoni MT' (BOD_B.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_I.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Dubai' (DUBAI-LIGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Comic Sans MS' (comic.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbelz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'MS Reference Sans Serif' (REFSAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Algerian' (ALGER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (arialbi.ttf) italic normal 700 normal>) = 1.335
findfont: score(<Font 'Arial Nova' (ArialNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Cambria' (cambriab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Candara' (Candaral.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Rockwell Nova' (RockwellNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Bodoni MT' (BOD_PSTC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comici.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Chiller' (CHILLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Courier New' (couri.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft New Tai Lue' (ntailub.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Demi' (FRADMIT.TTF) italic normal demi normal>) = 11.24
findfont: score(<Font 'Berlin Sans FB Demi' (BRLNSDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Garamond' (GARABD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Trebuchet MS' (trebucit.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Candara' (Candarali.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Microsoft Tai Le' (taile.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Freestyle Script' (FREESCPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Yu Gothic' (YuGothR.ttc) normal normal regular normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (BKANT.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Cambria' (cambria.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'MT Extra' (MTEXTRA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Goudy Old Style' (GOUDOSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Stencil' (STENCIL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Condensed' (ROCC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Perpetua' (PER_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Matura MT Script Capitals' (MATURASC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'SimSun' (simsun.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (ANTQUABI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana' (verdana.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Malgun Gothic' (malgun.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'High Tower Text' (HTOWERTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (ARIALNB.TTF) normal normal 700 condensed>) = 0.5349999999999999
findfont: score(<Font 'Bell MT' (BELLB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Bell MT' (BELL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Cambria' (cambria.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed' (TCCB____.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Elephant' (ELEPHNT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Castellar' (CASTELAR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tw Cen MT' (TCM_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Constantia' (constan.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansItNova.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Rockwell Nova' (RockwellNova-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Freestyle Script' (FREESCPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tempus Sans ITC' (TEMPSITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Playbill' (PLAYBILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (ANTQUAI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Calisto MT' (CALISTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Parchment' (PARCHM.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Curlz MT' (CURLZ___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Onyx' (ONYX.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Kunstler Script' (KUNSTLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbeli.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Cambria' (cambriaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Segoe Print' (segoeprb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Bahnschrift' (bahnschrift.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium' (framdit.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-66MdIt.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Goudy Old Style' (GOUDOSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Californian FB' (CALIFB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MS Reference Sans Serif' (REFSAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gadugi' (gadugi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANSD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia' (georgiaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Jokerman' (JOKERMAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHVIT.TTF) italic normal heavy normal>) = 11.43
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Calibri' (calibrib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft YaHei' (msyh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Demi' (FRADM.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Segoe UI Emoji' (seguiemj.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Niagara Solid' (NIAGSOL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium' (framd.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Constantia' (constanz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Snap ITC' (SNAP____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Garamond' (GARABD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Calisto MT' (CALISTB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Yu Gothic' (YuGothL.ttc) normal normal light normal>) = 10.24
findfont: score(<Font 'Bradley Hand ITC' (BRADHITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Courier New' (couri.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'SimSun-ExtB' (simsunb.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_BLAR.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Arial' (arialbd.ttf) normal normal 700 normal>) = 0.33499999999999996
findfont: score(<Font 'Papyrus' (PAPYRUS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Baskerville Old Face' (BASKVILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Calligraphy' (LCALLIG.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe UI' (segoeuii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Tahoma' (tahomabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Javanese Text' (javatext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Viner Hand ITC' (VINERITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Nova' (ArialNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Leelawadee UI' (LeelUIsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Bookshelf Symbol 7' (BSSYM7.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Consolas' (consolab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Eras Light ITC' (ERASLGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Myanmar Text' (mmrtextb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Sans Unicode' (l_10646.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Snap ITC' (SNAP____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Handwriting' (LHANDW.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Fax' (LFAXDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Nirmala UI' (NirmalaB.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Ebrima' (ebrimabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft Yi Baiti' (msyi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHVIT.TTF) italic normal heavy normal>) = 11.43
findfont: score(<Font 'Segoe UI' (seguisb.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Gill Sans Nova' (GillSansBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Bauhaus 93' (BAUHS93.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Console' (lucon.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Vivaldi' (VIVALDII.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Calibri' (calibri.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Elephant' (ELEPHNT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Vivaldi' (VIVALDII.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Franklin Gothic Heavy' (FRAHV.TTF) normal normal heavy normal>) = 10.43
findfont: score(<Font 'Franklin Gothic Demi' (FRADM.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Agency FB' (AGENCYB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tahoma' (tahoma.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Handwriting' (LHANDW.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Century Schoolbook' (SCHLBKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Agency FB' (AGENCYR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Californian FB' (CALIFI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Calisto MT' (CALIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Elephant' (ELEPHNTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'OCR A Extended' (OCRAEXT.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (ARIALNBI.TTF) italic normal 700 condensed>) = 1.535
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-65Md.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Curlz MT' (CURLZ___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Showcard Gothic' (SHOWG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Eras Medium ITC' (ERASMD.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Segoe UI Symbol' (seguisym.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Calisto MT' (CALISTB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-66MdIt.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Tw Cen MT' (TCM_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguisbi.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Old English Text MT' (OLDENGL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (ARIALNI.TTF) italic normal 400 condensed>) = 1.25
findfont: score(<Font 'Malgun Gothic' (malgunsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Myanmar Text' (mmrtext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Himalaya' (himalaya.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee UI' (LeelaUIb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Monotype Corsiva' (MTCORSVA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Perpetua' (PERB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Chiller' (CHILLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calisto MT' (CALISTBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Haettenschweiler' (HATTEN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_B.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial Nova' (ArialNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_CBI.TTF) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Bodoni MT' (BOD_R.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia' (georgia.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CI.TTF) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Gill Sans MT' (GIL_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gadugi' (gadugi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Leelawadee UI' (LeelUIsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-55Rg.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comicbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Sitka Small' (SitkaB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-55Rg.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Candara' (Candarab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'MS Outlook' (OUTLOOK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (arial.ttf) normal normal 400 normal>) = 0.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Mongolian Baiti' (monbaiti.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbel.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Calibri' (calibrii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Myanmar Text' (mmrtextb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans MT' (GILB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Agency FB' (AGENCYR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calisto MT' (CALISTBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Niagara Solid' (NIAGSOL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Copperplate Gothic Light' (COPRGTL.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPE.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_BI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans MT' (GILI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Perpetua' (PER_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Harrington' (HARNGTON.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana' (verdanai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansLightItNova.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Gill Sans Ultra Bold Condensed' (GILLUBCD.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Segoe UI' (seguibli.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Niagara Engraved' (NIAGENG.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuisl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Dubai' (DUBAI-MEDIUM.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Rockwell' (ROCKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Sans' (LSANSD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Imprint MT Shadow' (IMPRISHA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT' (TCMI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Sitka Small' (SitkaB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Comic Sans MS' (comicz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Poor Richard' (POORICH.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Fax' (LFAXI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Wingdings 2' (WINGDNG2.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Century Gothic' (GOTHICBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Engravers MT' (ENGR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Ravie' (RAVIE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Brush Script MT' (BRUSHSCI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe Print' (segoepr.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguibl.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Jokerman' (JOKERMAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT' (GILB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Times New Roman' (timesi.ttf) italic normal roman normal>) = 11.145
findfont: score(<Font 'Sylfaen' (sylfaen.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERB____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_CI.TTF) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Lucida Fax' (LFAX.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondUltraBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Playbill' (PLAYBILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'French Script MT' (FRSCRIPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Wingdings 3' (WINGDNG3.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (timesbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Agency FB' (AGENCYB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Calligraphy' (LCALLIG.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Courier New' (cour.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT' (TCBI____.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Arial' (ariblk.ttf) normal normal black normal>) = 0.525
findfont: score(<Font 'Viner Hand ITC' (VINERITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Modern No. 20' (MOD20.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOS.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Ebrima' (ebrima.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (Sitka.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Tai Le' (taile.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Pristina' (PRISTINA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Imprint MT Shadow' (IMPRISHA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Forte' (FORTE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansItNova.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Harlow Solid Italic' (HARLOWSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Malgun Gothic' (malgunbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Harlow Solid Italic' (HARLOWSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Perpetua' (PERBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Fax' (LFAXD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Nirmala UI' (NirmalaS.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Copperplate Gothic Bold' (COPRGTB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Lucida Console' (lucon.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Consolas' (consolai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia' (georgiab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Ravie' (RAVIE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Constantia' (constani.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia' (georgiai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Comic Sans MS' (comicbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Malgun Gothic' (malgunsl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEBO.TTF) oblique normal 700 normal>) = 11.335
findfont: score(<Font 'High Tower Text' (HTOWERTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft JhengHei' (msjhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Californian FB' (CALIFI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Dubai' (DUBAI-REGULAR.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comic.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Constantia' (constanz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sitka Small' (SitkaZ.ttc) italic normal 700 normal>) = 11.335
findfont: score(<Font 'MS Reference Specialty' (REFSPCL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Berlin Sans FB Demi' (BRLNSDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MS Gothic' (msgothic.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (times.ttf) normal normal roman normal>) = 10.145
findfont: score(<Font 'Castellar' (CASTELAR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT' (GILBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Modern No. 20' (MOD20.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Extra Bold' (ROCKEB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Trebuchet MS' (trebucbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Century Schoolbook' (SCHLBKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Franklin Gothic Book' (FRABKIT.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansUltraBoNova.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell' (ROCKI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe Script' (segoesc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansLightNova.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Arial Nova' (ArialNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-65Md.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Gill Sans Nova' (GillSansLightItNova.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Calibri' (calibril.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Britannic Bold' (BRITANIC.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Gill Sans MT' (GILBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Ebrima' (ebrimabd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Constantia' (constanb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Candara' (Candarali.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Franklin Gothic Medium' (framdit.ttf) italic normal medium normal>) = 11.145
findfont: score(<Font 'Palatino Linotype' (pala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Candara' (Candarab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Marlett' (marlett.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBlackItalic.ttf) italic normal black condensed>) = 11.725
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed' (TCCB____.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Times New Roman' (timesi.ttf) italic normal roman normal>) = 11.145
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Comic Sans MS' (comicz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-76BdIt.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'MT Extra' (MTEXTRA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Wide Latin' (LATINWD.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Segoe MDL2 Assets' (segmdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft New Tai Lue' (ntailub.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Calisto MT' (CALIST.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Cambria' (cambriab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Consolas' (consolaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana' (verdanab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Cooper Black' (COOPBL.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Constantia' (constani.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft Sans Serif' (micross.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calibri' (calibrib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe Script' (segoesc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bauhaus 93' (BAUHS93.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'SimSun' (simsun.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Italic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Segoe UI Symbol' (seguisym.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'High Tower Text' (HTOWERT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Garamond' (GARAIT.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans MT Condensed' (GILC____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'SimSun-ExtB' (simsunb.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Consolas' (consolaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Yu Gothic' (YuGothB.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Leelawadee UI' (LeelaUIb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft JhengHei' (msjh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOS.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Microsoft PhagsPa' (phagspa.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Parchment' (PARCHM.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Californian FB' (CALIFR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Nova' (ArialNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe MDL2 Assets' (segmdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century' (CENTURY.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Wingdings 3' (WINGDNG3.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (seguisbi.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Blackadder ITC' (ITCBLKAD.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Trebuchet MS' (trebuc.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Garamond' (GARA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bradley Hand ITC' (BRADHITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Magneto' (MAGNETOB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Kunstler Script' (KUNSTLER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans Unicode' (l_10646.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana' (verdana.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Calibri' (calibril.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Webdings' (webdings.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuil.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'MV Boli' (mvboli.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Leelawadee UI' (LeelawUI.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Palace Script MT' (PALSCRI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Times New Roman' (times.ttf) normal normal roman normal>) = 10.145
findfont: score(<Font 'Felix Titling' (FELIXTI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Eras Medium ITC' (ERASMD.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Gill Sans MT' (GIL_____.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Juice ITC' (JUICE___.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Constantia' (constanb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Cambria' (cambriaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Candara' (Candaraz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft Sans Serif' (micross.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Trebuchet MS' (trebucbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft New Tai Lue' (ntailu.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Blackadder ITC' (ITCBLKAD.TTF) normal normal black normal>) = 10.525
findfont: score(<Font 'Brush Script MT' (BRUSHSCI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Corbel' (corbeli.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Pristina' (PRISTINA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Garamond' (GARA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Bright' (LBRITEI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Bright' (LBRITE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gabriola' (Gabriola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana' (verdanab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoNova.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Gill Sans Nova' (GillSansLightNova.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Georgia' (georgiai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe UI' (seguibli.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Segoe Script' (segoescb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell' (ROCKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gadugi' (gadugib.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft JhengHei' (msjhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Goudy Old Style' (GOUDOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Ebrima' (ebrima.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Franklin Gothic Book' (FRABKIT.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Arial Nova' (ArialNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'Lucida Bright' (LBRITEI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Myanmar Text' (mmrtext.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Yu Gothic' (YuGothM.ttc) normal normal medium normal>) = 10.145
findfont: score(<Font 'Trebuchet MS' (trebucit.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Franklin Gothic Demi Cond' (FRADMCN.TTF) normal normal demi condensed>) = 10.44
findfont: score(<Font 'Palatino Linotype' (palabi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-75Bd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Wingdings' (wingding.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbelz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Britannic Bold' (BRITANIC.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Segoe UI' (segoeuii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft YaHei' (msyhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Franklin Gothic Medium' (framd.ttf) normal normal medium normal>) = 10.145
findfont: score(<Font 'Maiandra GD' (MAIAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Courier New' (courbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Arial' (ARIALN.TTF) normal normal 400 condensed>) = 0.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondItalic.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Bookman Old Style' (BOOKOSI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Tw Cen MT Condensed' (TCCM____.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Arial Nova' (ArialNova-Light.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Eras Bold ITC' (ERASBD.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Rage Italic' (RAGE.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Calibri' (calibrii.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Ultra Bold Condensed' (GILLUBCD.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Microsoft PhagsPa' (phagspab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Gill Sans Nova' (GillSansNova.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Schoolbook' (SCHLBKI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Verdana' (verdanaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoItNova.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Candara' (Candarai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Baskerville Old Face' (BASKVILL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-76BdIt.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBoldItalic.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Leelawadee' (LEELAWAD.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Rockwell' (ROCKB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial Nova' (ArialNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Eras Demi ITC' (ERASDEMI.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Segoe UI' (seguibl.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Californian FB' (CALIFB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Tempus Sans ITC' (TEMPSITC.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Fax' (LFAX.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Eras Demi ITC' (ERASDEMI.TTF) normal normal demi normal>) = 10.24
findfont: score(<Font 'Corbel' (corbelb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Sitka Small' (SitkaZ.ttc) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rage Italic' (RAGE.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Ultra Bold' (GILSANUB.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Wingdings' (wingding.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Footlight MT Light' (FTLTLT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Georgia' (georgiaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Nirmala UI' (Nirmala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium Cond' (FRAMDCN.TTF) normal normal medium condensed>) = 10.344999999999999
findfont: score(<Font 'Tw Cen MT' (TCMI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Microsoft Tai Le' (taileb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Candara' (Candaral.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Edwardian Script ITC' (ITCEDSCR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial Nova' (ArialNovaCond.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondSemiBoldItalic.ttf) italic normal semibold condensed>) = 11.44
findfont: score(<Font 'Dubai' (DUBAI-BOLD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BLAI.TTF) italic normal black normal>) = 11.525
findfont: score(<Font 'Verdana Pro' (VerdanaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Calibri' (calibri.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-56It.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (arialbd.ttf) normal normal 700 normal>) = 0.33499999999999996
findfont: score(<Font 'Informal Roman' (INFROMAN.TTF) normal normal roman normal>) = 10.145
findfont: score(<Font 'Eras Light ITC' (ERASLGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Franklin Gothic Book' (FRABK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Wingdings 2' (WINGDNG2.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gigi' (GIGI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed Extra Bold' (TCCEB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Dubai' (DUBAI-LIGHT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Tw Cen MT' (TCBI____.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Cambria' (cambriai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Malgun Gothic' (malgunbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Mongolian Baiti' (monbaiti.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Bright' (LBRITE.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Consolas' (consolai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-75Bd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Calibri' (calibriz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft JhengHei' (msjh.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft Yi Baiti' (msyi.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondBoItNova.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Rockwell Nova' (RockwellNova-LightItalic.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Harrington' (HARNGTON.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondLight.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Gill Sans Nova' (GillSansBoItNova.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Nirmala UI' (Nirmala.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell Nova' (RockwellNova-ExtraBold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Corbel' (corbelli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Dubai' (DUBAI-MEDIUM.TTF) normal normal medium normal>) = 10.145
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-BlackItalic.ttf) italic normal black normal>) = 11.525
findfont: score(<Font 'Century Gothic' (GOTHICB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Lucida Bright' (LBRITEDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Palace Script MT' (PALSCRI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Microsoft PhagsPa' (phagspab.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MingLiU-ExtB' (mingliub.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Sylfaen' (sylfaen.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Lucida Sans' (LSANS.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'Perpetua' (PERBI___.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Rockwell Nova' (RockwellNova-Bold.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Bodoni MT' (BOD_BLAI.TTF) italic normal black normal>) = 11.525
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century' (CENTURY.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbell.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'French Script MT' (FRSCRIPT.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Neue Haas Grotesk Text Pro' (NHaasGroteskTXPro-56It.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Book Antiqua' (ANTQUAI.TTF) italic normal book normal>) = 11.05
findfont: score(<Font 'Century Schoolbook' (CENSCBK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Lucida Bright' (LBRITED.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Leelawadee' (LEELAWAD.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT' (GILI____.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Leelawadee' (LEELAWDB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI' (seguisb.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Garamond' (GARAIT.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Candara' (Candara.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Berlin Sans FB' (BRLNSR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-Italic.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Arial' (arialbi.ttf) italic normal 700 normal>) = 1.335
findfont: score(<Font 'Book Antiqua' (ANTQUAB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Courier New' (courbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Palatino Linotype' (palai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Segoe Script' (segoescb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'MS Reference Specialty' (REFSPCL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBlack.ttf) normal normal black condensed>) = 10.725
findfont: score(<Font 'Verdana' (verdanai.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Perpetua Titling MT' (PERTIBD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Wide Latin' (LATINWD.TTF) normal normal 400 expanded>) = 10.25
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Verdana' (verdanaz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Century Gothic' (GOTHICI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Old English Text MT' (OLDENGL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Medium Cond' (FRAMDCN.TTF) normal normal medium condensed>) = 10.344999999999999
findfont: score(<Font 'Gill Sans Nova' (GillSansCondLightItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Maiandra GD' (MAIAN.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans MT Ext Condensed Bold' (GLSNECB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Regular.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gloucester MT Extra Condensed' (GLECB.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Yu Gothic' (YuGothR.ttc) normal normal regular normal>) = 10.05
findfont: score(<Font 'Ink Free' (Inkfree.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Schoolbook' (SCHLBKBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Calibri' (calibrili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Segoe UI' (segoeuisl.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Trebuchet MS' (trebucbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Perpetua Titling MT' (PERTILI.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Copperplate Gothic Light' (COPRGTL.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Script MT Bold' (SCRIPTBL.TTF) normal normal bold normal>) = 10.335
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-LightItalic.ttf) italic normal light condensed>) = 11.44
findfont: score(<Font 'Book Antiqua' (BKANT.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Bookman Old Style' (BOOKOSB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI Historic' (seguihis.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Franklin Gothic Book' (FRABK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Comic Sans MS' (comici.ttf) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Nirmala UI' (NirmalaS.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Trebuchet MS' (trebucbd.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'HoloLens MDL2 Assets' (holomdl2.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondRegular.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Footlight MT Light' (FTLTLT.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Lucida Sans' (LSANSDI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Gloucester MT Extra Condensed' (GLECB.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Corbel' (corbell.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Papyrus' (PAPYRUS.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Arial' (ARIALNBI.TTF) italic normal 700 condensed>) = 1.535
findfont: score(<Font 'Arial Nova' (ArialNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEO.TTF) oblique normal 400 normal>) = 11.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-CondSemiBold.ttf) normal normal semibold condensed>) = 10.44
findfont: score(<Font 'Book Antiqua' (ANTQUABI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Georgia' (georgia.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CB.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Century Gothic' (GOTHICBI.TTF) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Consolas' (consola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Centaur' (CENTAUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Corbel' (corbelb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Century Gothic' (GOTHICB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft PhagsPa' (phagspa.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Symbol' (symbol.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Calibri' (calibrili.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Arial Nova' (ArialNovaCond-BoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Lucida Sans' (LSANSI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Consolas' (consola.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bodoni MT' (BOD_CB.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Arial' (ariali.ttf) italic normal 400 normal>) = 1.05
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPEB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Goudy Stout' (GOUDYSTO.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Georgia Pro' (GeorgiaPro-SemiBoldItalic.ttf) italic normal semibold normal>) = 11.24
findfont: score(<Font 'Symbol' (symbol.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Book Antiqua' (ANTQUAB.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Segoe UI' (seguisli.ttf) italic normal light normal>) = 11.24
findfont: score(<Font 'Malgun Gothic' (malgun.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gigi' (GIGI.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT Condensed Extra Bold' (TCCEB.TTF) normal normal bold condensed>) = 10.535
findfont: score(<Font 'Candara' (Candara.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Bell MT' (BELLI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Elephant' (ELEPHNTI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Vladimir Script' (VLADIMIR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tw Cen MT' (TCB_____.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Microsoft Tai Le' (taileb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Rockwell Condensed' (ROCCB___.TTF) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Bodoni MT' (BOD_I.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Gill Sans Nova' (GillSansBoItNova.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Bernard MT Condensed' (BERNHC.TTF) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Rockwell' (ROCK.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Tahoma' (tahoma.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Stencil' (STENCIL.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Segoe UI' (segoeuil.ttf) normal normal light normal>) = 10.24
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraItNova.ttf) italic normal 400 condensed>) = 11.25
findfont: score(<Font 'Microsoft New Tai Lue' (ntailu.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Impact' (impact.ttf) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Rockwell' (ROCKI.TTF) italic normal 400 normal>) = 11.05
findfont: score(<Font 'Lucida Fax' (LFAXD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Arial' (ariali.ttf) italic normal 400 normal>) = 1.05
findfont: score(<Font 'Segoe UI' (segoeuiz.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Microsoft Uighur' (MSUIGHUR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua Titling MT' (PERTILI.TTF) normal normal light normal>) = 10.24
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Bold.ttf) normal normal 700 condensed>) = 10.535
findfont: score(<Font 'Microsoft YaHei' (msyhbd.ttc) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Times New Roman' (timesbi.ttf) italic normal 700 normal>) = 11.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-SemiBold.ttf) normal normal semibold normal>) = 10.24
findfont: score(<Font 'Lucida Sans Typewriter' (LTYPE.TTF) normal normal regular normal>) = 10.05
findfont: score(<Font 'MS Gothic' (msgothic.ttc) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Verdana Pro' (VerdanaPro-Black.ttf) normal normal black normal>) = 10.525
findfont: score(<Font 'Segoe Print' (segoeprb.ttf) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Verdana Pro' (VerdanaPro-CondBoldItalic.ttf) italic normal 700 condensed>) = 11.535
findfont: score(<Font 'Goudy Stout' (GOUDYSTO.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Perpetua Titling MT' (PERTIBD.TTF) normal normal 700 normal>) = 10.335
findfont: score(<Font 'Monotype Corsiva' (MTCORSVA.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Gill Sans Nova' (GillSansCondExtraNova.ttf) normal normal 400 condensed>) = 10.25
findfont: score(<Font 'Rockwell Nova' (RockwellNovaCond-Light.ttf) normal normal light condensed>) = 10.44
findfont: score(<Font 'Californian FB' (CALIFR.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Century Schoolbook' (CENSCBK.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Bookshelf Symbol 7' (BSSYM7.TTF) normal normal book normal>) = 10.05
findfont: score(<Font 'Algerian' (ALGER.TTF) normal normal 400 normal>) = 10.05
findfont: score(<Font 'Palatino Linotype' (palabi.ttf) italic normal 700 normal>) = 11.335
findfont: Matching sans\-serif:style=normal:variant=normal:weight=normal:stretch=normal:size=12.0 to Arial ('C:\\windows\\Fonts\\arial.ttf') with score of 0.050000.

Lets define new metric features after the analyse of correlation matrix

In [84]:
metric_features_nmulticolinearete=["RAMNTALL","IC1","AVGGIFT","month_minimum_gift","months_lastgift",
                                   "month_largest_gift", "month_of_last_gift"]#,, "WEALTH2", 
In [85]:
# count of missing values
datasetlapsed[metric_features_nmulticolinearete].isna().sum()
Out[85]:
RAMNTALL              0
IC1                   0
AVGGIFT               0
month_minimum_gift    0
months_lastgift       0
month_largest_gift    0
month_of_last_gift    0
dtype: int64
In [86]:
# descriptive statistics
datasetlapsed[metric_features_nmulticolinearete].describe(include="all").T  # try with all and without all
Out[86]:
count mean std min 25% 50% 75% max
RAMNTALL 84125.0 98.358020 101.538644 13.000000 38.00 75.0 125.000000 5674.9
IC1 84125.0 339.471132 162.267917 0.000000 230.00 309.0 414.000000 1500.0
AVGGIFT 84125.0 13.166552 9.222358 1.285714 8.25 11.5 15.333333 500.0
month_minimum_gift 84125.0 6.360285 3.906519 1.000000 2.00 6.0 10.000000 12.0
months_lastgift 84125.0 18.277159 2.482902 13.000000 16.00 18.0 20.000000 24.0
month_largest_gift 84125.0 7.071251 4.043233 1.000000 3.00 8.0 11.000000 12.0
month_of_last_gift 84125.0 6.873771 4.346367 1.000000 2.00 8.0 11.000000 12.0
In [87]:
clusterdataset=datasetlapsed[metric_features_nmulticolinearete].copy()
In [88]:
clusterdataset
Out[88]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift
CONTROLN
95515 240.0 307 7.741935 8 18 2 12
148535 47.0 1088 15.666667 10 18 12 12
15078 202.0 251 7.481481 11 18 7 12
172556 109.0 386 6.812500 11 18 11 12
7112 254.0 240 6.864865 10 17 1 1
... ... ... ... ... ... ... ...
58178 59.0 159 5.900000 1 20 8 10
156106 80.0 224 26.666667 8 22 12 8
35088 81.0 285 3.375000 2 16 3 2
184568 25.0 433 25.000000 2 16 2 2
122706 20.0 806 20.000000 3 15 3 3

84125 rows × 7 columns

Data Normalization

minmax

In [89]:
clusterdataset_minmax = clusterdataset.copy()
clusterdataset_minmax 
Out[89]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift
CONTROLN
95515 240.0 307 7.741935 8 18 2 12
148535 47.0 1088 15.666667 10 18 12 12
15078 202.0 251 7.481481 11 18 7 12
172556 109.0 386 6.812500 11 18 11 12
7112 254.0 240 6.864865 10 17 1 1
... ... ... ... ... ... ... ...
58178 59.0 159 5.900000 1 20 8 10
156106 80.0 224 26.666667 8 22 12 8
35088 81.0 285 3.375000 2 16 3 2
184568 25.0 433 25.000000 2 16 2 2
122706 20.0 806 20.000000 3 15 3 3

84125 rows × 7 columns

In [90]:
# Use MinMaxScaler to scale the data
scaler = MinMaxScaler()
clusterdataset_minmax_scaled = scaler.fit_transform(clusterdataset_minmax)
clusterdataset_minmax_scaled 
Out[90]:
array([[0.04009255, 0.20466667, 0.01294573, ..., 0.45454545, 0.09090909,
        1.        ],
       [0.00600505, 0.72533333, 0.02883605, ..., 0.45454545, 1.        ,
        1.        ],
       [0.03338102, 0.16733333, 0.01242348, ..., 0.45454545, 0.54545455,
        1.        ],
       ...,
       [0.0120101 , 0.19      , 0.00418934, ..., 0.27272727, 0.18181818,
        0.09090909],
       [0.00211943, 0.28866667, 0.04755085, ..., 0.27272727, 0.09090909,
        0.09090909],
       [0.00123633, 0.53733333, 0.03752506, ..., 0.18181818, 0.18181818,
        0.18181818]])
In [91]:
# See what the fit method is doing (notice the trailing underscore):
print("Parameters fitted:\n", scaler.data_min_, "\n", scaler.data_max_)
Parameters fitted:
 [13.          0.          1.28571429  1.         13.          1.
  1.        ] 
 [5674.9 1500.   500.    12.    24.    12.    12. ]
In [92]:
clusterdataset_minmax[metric_features_nmulticolinearete] = clusterdataset_minmax_scaled
clusterdataset_minmax.head()
Out[92]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift
CONTROLN
95515 0.040093 0.204667 0.012946 0.636364 0.454545 0.090909 1.0
148535 0.006005 0.725333 0.028836 0.818182 0.454545 1.000000 1.0
15078 0.033381 0.167333 0.012423 0.909091 0.454545 0.545455 1.0
172556 0.016955 0.257333 0.011082 0.909091 0.454545 0.909091 1.0
7112 0.042565 0.160000 0.011187 0.818182 0.363636 0.000000 0.0
In [93]:
# Checking max and min of minmaxed variables
clusterdataset_minmax.describe().round(2)
Out[93]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift
count 84125.00 84125.00 84125.00 84125.00 84125.00 84125.00 84125.00
mean 0.02 0.23 0.02 0.49 0.48 0.55 0.53
std 0.02 0.11 0.02 0.36 0.23 0.37 0.40
min 0.00 0.00 0.00 0.00 0.00 0.00 0.00
25% 0.00 0.15 0.01 0.09 0.27 0.18 0.09
50% 0.01 0.21 0.02 0.45 0.45 0.64 0.64
75% 0.02 0.28 0.03 0.82 0.64 0.91 0.91
max 1.00 1.00 1.00 1.00 1.00 1.00 1.00

Outliers- Boxplot

In [94]:
# All Numeric Variables' Box Plots in one figure
sns.set()

# Prepare figure. Create individual axes where each box plot will be placed
fig, axes = plt.subplots(2, math.ceil(len(metric_features_nmulticolinearete) / 2), figsize=(15, 10))

# Plot data
# Iterate across axes objects and associate each box plot (hint: use the ax argument):
for ax, feat in zip(axes.flatten(), metric_features_nmulticolinearete): # Notice the zip() function and flatten() method
    sns.boxplot(x=clusterdataset[feat], ax=ax)
    
# Layout
# Add a centered title to the figure:
#title = "Numeric Variables' Box Plots"

#plt.suptitle(title)

plt.savefig(os.path.join('numeric_variables_boxplots.png'), dpi=300)
plt.show()
In [ ]:
 

Before we proceed: Lets take out the outiliers using DBSCAN

In [ ]:
 
In [95]:
# Adapted from:
# https://towardsdatascience.com/k-means-dbscan-gmm-agglomerative-clustering-mastering-the-popular-models-in-a-segmentation-c891a3818e29
from kneed import KneeLocator
neighbors=[10, 15, 50, 100, 500]#[10,15,20,25,30,35,40, 45, 50]
eps=[]
for i in neighbors:
    nearest_neighbors = NearestNeighbors(n_neighbors=i)
    neighbors = nearest_neighbors.fit(clusterdataset_minmax)
    distances, indices = neighbors.kneighbors(clusterdataset_minmax)
    distances = np.sort(distances[:,i-1], axis=0)
    j = np.arange(len(distances))
    knee = KneeLocator(j, distances, S=1, curve='convex', direction='increasing', interp_method='polynomial')
    fig = plt.figure(figsize=(5, 5))
    knee.plot_knee()
    plt.xlabel("Points")
    plt.ylabel("Distance")
    eps.append(distances[knee.knee])
    print(i, distances[knee.knee])
    plt.savefig(os.path.join('eps.png'), dpi=350)
10 0.07802905606646471
15 0.09500833487906588
50 0.12862159908300475
100 0.15643176846694362
500 0.22481194244797262
<Figure size 360x360 with 0 Axes>
<Figure size 360x360 with 0 Axes>
<Figure size 360x360 with 0 Axes>
<Figure size 360x360 with 0 Axes>
<Figure size 360x360 with 0 Axes>
In [96]:
# dbscan = DBSCAN(eps= 0.19465529677899998, min_samples=10)

# # Then fit the model to your data using the fit method
# model = dbscan.fit(clusterdataset_minmax)
    
# # Calculate Silhoutte Score

# score = silhouette_score(clusterdataset_minmax, model.labels_, metric='euclidean')
    
# score
In [97]:
# addaptd from:
# https://towardsdatascience.com/k-means-dbscan-gmm-agglomerative-clustering-mastering-the-popular-models-in-a-segmentation-c891a3818e29


# Silhouette Score for DBSCAN

from sklearn.metrics import silhouette_score 
from sklearn.cluster import DBSCAN

def get_dbscan_score(dataframe, eps1, center):
    '''
    
    INPUT:
        data - the dataset you want to fit kmeans to
        center - the number of centers you want (the k value)
    OUTPUT:
        score - the Silhouette Score for DBSCAN
    '''
    #instantiate kmeans
    dbscan = DBSCAN(eps= eps1, min_samples=center)

    # Then fit the model to your data using the fit method
    model = dbscan.fit(dataframe)
    
    # Calculate Silhoutte Score

    score = silhouette_score(dataframe, model.labels_, metric='euclidean')
    
    return score
In [98]:
np.linspace(10, 40, 4).astype(int)
Out[98]:
array([10, 20, 30, 40])
In [99]:
# Adapted from:
# https://towardsdatascience.com/k-means-dbscan-gmm-agglomerative-clustering-mastering-the-popular-models-in-a-segmentation-c891a3818e29
centers = np.linspace(10, 40, 4).astype(int)
eps11=eps
eps_=[]
for eps1 in eps11: 
    scores = []
    min_samples= []
    for center in centers:
        scores.append(get_dbscan_score(clusterdataset_minmax, eps1, center))
        eps_.append(eps1)
        min_samples.append(center)
        print (eps1, center,get_dbscan_score(clusterdataset_minmax, eps1, center) )
    fig = plt.figure(figsize=(5, 5))
    plt.plot(centers, scores, linestyle='--', marker='o', color='b');
    plt.xlabel('min_samples');
    plt.ylabel('Silhouette Score');
    plt.title('Silhouette Score vs. min_samples');
    plt.savefig(os.path.join('epsminptsshe.png'), dpi=300)

#df3 = pd.DataFrame(centers,columns=['min_samples'])
#df3['eps_'] =eps1
#df3['scores'] = scores
#df4 = df3[df3.scores == df3.scores.max()]

#print('Optimal number of min_samples based on silhouette score:', df4['min_samples'].tolist())
0.07802905606646471 10 0.16692815960043494
0.07802905606646471 20 0.07385097705516432
0.07802905606646471 30 -0.0024906424254366767
0.07802905606646471 40 -0.0654615938669058
0.09500833487906588 10 -0.09807575319481054
0.09500833487906588 20 -0.11581568074730429
0.09500833487906588 30 -0.18250372057736144
0.09500833487906588 40 -0.29280419081989345
0.12862159908300475 10 0.0790342568002073
0.12862159908300475 20 0.2969360383304395
0.12862159908300475 30 0.2913182255317231
0.12862159908300475 40 0.279504125506109
0.15643176846694362 10 0.3407376168461333
0.15643176846694362 20 0.33024201111461116
0.15643176846694362 30 0.32470218098651915
0.15643176846694362 40 0.3203308486502024
0.22481194244797262 10 0.3699136239278695
0.22481194244797262 20 0.3714599901265763
0.22481194244797262 30 0.36926013269611346
0.22481194244797262 40 0.3670548863477449
In [100]:
 
Out[100]:
array([15, 26, 37, 48, 60])
In [113]:
#save the scores and mim_samples to csv
df3 = pd.DataFrame(centers,columns=['min_samples'])
df3['eps_'] =eps1
df3['silhouette score'] = scores

df3.to_csv(os.path.join("scores and mim_samples.csv"), index=True)
df3
Out[113]:
min_samples eps_ silhouette score
0 10 0.224812 0.369914
1 20 0.224812 0.371460
2 30 0.224812 0.369260
3 40 0.224812 0.367055
In [101]:
clusterdataset_minmax
Out[101]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift
CONTROLN
95515 0.040093 0.204667 0.012946 0.636364 0.454545 0.090909 1.000000
148535 0.006005 0.725333 0.028836 0.818182 0.454545 1.000000 1.000000
15078 0.033381 0.167333 0.012423 0.909091 0.454545 0.545455 1.000000
172556 0.016955 0.257333 0.011082 0.909091 0.454545 0.909091 1.000000
7112 0.042565 0.160000 0.011187 0.818182 0.363636 0.000000 0.000000
... ... ... ... ... ... ... ...
58178 0.008124 0.106000 0.009252 0.000000 0.636364 0.636364 0.818182
156106 0.011833 0.149333 0.050893 0.636364 0.818182 1.000000 0.636364
35088 0.012010 0.190000 0.004189 0.090909 0.272727 0.181818 0.090909
184568 0.002119 0.288667 0.047551 0.090909 0.272727 0.090909 0.090909
122706 0.001236 0.537333 0.037525 0.181818 0.181818 0.181818 0.181818

84125 rows × 7 columns

Applying DBSCAN with the parameters that provide the best Silhouette Score.

In [114]:
# Based on the hyperparameters found in the previous class
dbscan = DBSCAN(eps=0.22481194244797262, min_samples=20, n_jobs=4)
dbscan_labels = dbscan.fit_predict(clusterdataset_minmax)
Counter(dbscan_labels)
Out[114]:
Counter({0: 50062, 1: 33937, -1: 126})
In [115]:
Counter(dbscan_labels)
Out[115]:
Counter({0: 50062, 1: 33937, -1: 126})
In [116]:
dbscan_labels
Out[116]:
array([0, 0, 0, ..., 1, 1, 1], dtype=int64)

Creating new df with detected outliers (they may be classified later based on the final clusters)

In [117]:
# Save the newly detected outliers (they will be classified later based on the final clusters)
df_outliers = clusterdataset_minmax[dbscan_labels==-1].copy() #use method copy
df_outliers.shape
Out[117]:
(126, 7)

Creating new df without outliers

In [118]:
# New df without outliers
clusterdataset_minmax_no_outliers= clusterdataset_minmax[dbscan_labels!=-1].copy()
In [119]:
clusterdataset_minmax_no_outliers.shape
Out[119]:
(83999, 7)

Kmeans ++

In [120]:
range_clusters = range(1, 6)
In [121]:
inertia = []
for n_clus in range_clusters:  # iterate over desired ncluster range
    kmclust = KMeans(n_clusters=n_clus, init='k-means++', n_init=15, random_state=1)
    kmclust.fit(clusterdataset_minmax_no_outliers)
    inertia.append(kmclust.inertia_)  # save the inertia of the given cluster solution
In [122]:
# The inertia plot
plt.figure(figsize=(9,5))
plt.plot(inertia)
plt.ylabel("Inertia: SSw")
plt.xlabel("Number of clusters")
plt.title("Inertia plot over clusters", size=15)
plt.show()
In [123]:
# Adapted from:
# https://scikit-learn.org/stable/auto_examples/cluster/plot_kmeans_silhouette_analysis.html#sphx-glr-auto-examples-cluster-plot-kmeans-silhouette-analysis-py

# Storing average silhouette metric
avg_silhouette = []
for nclus in range_clusters:
    # Skip nclus == 1
    if nclus == 1:
        continue
    
    # Create a figure
    fig = plt.figure(figsize=(13, 7))

    # Initialize the KMeans object with n_clusters value and a random generator
    # seed of 10 for reproducibility.
    kmclust = KMeans(n_clusters=nclus, init='k-means++', n_init=15, random_state=1)
    cluster_labels = kmclust.fit_predict(clusterdataset_minmax_no_outliers)

    # The silhouette_score gives the average value for all the samples.
    # This gives a perspective into the density and separation of the formed clusters
    silhouette_avg = silhouette_score(clusterdataset_minmax_no_outliers, cluster_labels)
    avg_silhouette.append(silhouette_avg)
    print(f"For n_clusters = {nclus}, the average silhouette_score is : {silhouette_avg}")

    # Compute the silhouette scores for each sample
    sample_silhouette_values = silhouette_samples(clusterdataset_minmax_no_outliers, cluster_labels)

    y_lower = 10
    for i in range(nclus):
        # Aggregate the silhouette scores for samples belonging to cluster i, and sort them
        ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
        ith_cluster_silhouette_values.sort()
        
        # Get y_upper to demarcate silhouette y range size
        size_cluster_i = ith_cluster_silhouette_values.shape[0]
        y_upper = y_lower + size_cluster_i
        
        # Filling the silhouette
        color = cm.nipy_spectral(float(i) / nclus)
        plt.fill_betweenx(np.arange(y_lower, y_upper),
                          0, ith_cluster_silhouette_values,
                          facecolor=color, edgecolor=color, alpha=0.7)

        # Label the silhouette plots with their cluster numbers at the middle
        plt.text(-0.05, y_lower + 0.5 * size_cluster_i, str(i))

        # Compute the new y_lower for next plot
        y_lower = y_upper + 10  # 10 for the 0 samples

    plt.title("The silhouette plot for the various clusters.")
    plt.xlabel("The silhouette coefficient values")
    plt.ylabel("Cluster label")

    # The vertical line for average silhouette score of all the values
    plt.axvline(x=silhouette_avg, color="red", linestyle="--")
    
    # The silhouette coefficient can range from -1, 1
    xmin, xmax = np.round(sample_silhouette_values.min() -0.1, 2), np.round(sample_silhouette_values.max() + 0.1, 2)
    plt.xlim([xmin, xmax])
    
    # The (nclus+1)*10 is for inserting blank space between silhouette
    # plots of individual clusters, to demarcate them clearly.
    plt.ylim([0, len(clusterdataset_minmax_no_outliers) + (nclus + 1) * 10])

    plt.yticks([])  # Clear the yaxis labels / ticks
    plt.xticks(np.arange(xmin, xmax, 0.1))
    plt.savefig(os.path.join('kmean++.png'), dpi=300)
For n_clusters = 2, the average silhouette_score is : 0.3893329741690579
For n_clusters = 3, the average silhouette_score is : 0.3343229083224461
For n_clusters = 4, the average silhouette_score is : 0.35818765467863384
For n_clusters = 5, the average silhouette_score is : 0.3747925345509048

Final KMeans ++ clustering solution

In [ ]:
 
In [182]:
# final cluster solution
number_clusters = 3
kmclust = KMeans(n_clusters=number_clusters, init='k-means++', n_init=15, random_state=1)
km_labels = kmclust.fit_predict(clusterdataset_minmax_no_outliers)
km_labels.shape
Out[182]:
(83999,)
In [ ]:
 
In [183]:
# Creating a dataFrame with labes
df_labels = pd.DataFrame(km_labels,columns=['labelskmeans++'])
df_labels['index'] =clusterdataset_minmax_no_outliers.index
df_labels.set_index("index", inplace = True)
In [ ]:
 

Characterizing the final clusters

In [240]:
# Characterizing the final clusters
df_kmeanspp = pd.concat((clusterdataset_minmax_no_outliers, df_labels), axis=1)
df_kmeanspp.groupby('labelskmeans++').count()
Out[240]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift
labelskmeans++
0 28425 28425 28425 28425 28425 28425 28425
1 33831 33831 33831 33831 33831 33831 33831
2 21743 21743 21743 21743 21743 21743 21743
In [ ]:
 

inter-cluster distance map

In [185]:
# Inter cluster distance map
from yellowbrick.cluster import InterclusterDistance
# Instantiate the clustering model and visualizer
visualizer = InterclusterDistance(kmclust)
visualizer.fit(df_kmeanspp)        # Fit the data to the visualizer
visualizer.show()        # Finalize and render the figure
plt.savefig(os.path.join('InterclusterDistance.png'), dpi=300)
<Figure size 576x396 with 0 Axes>

Cluster Analysis

In [186]:
def cluster_profiles(df, label_columns, figsize, compar_titles=None):
    """
    Pass df with labels columns of one or multiple clustering labels. 
    Then specify this label columns to perform the cluster profile according to them.
    """
    if compar_titles == None:
        compar_titles = [""]*len(label_columns)
        
    sns.set()
    fig, axes = plt.subplots(nrows=len(label_columns), ncols=2, figsize=figsize, squeeze=False)
    for ax, label, titl in zip(axes, label_columns, compar_titles):
        # Filtering df
        drop_cols = [i for i in label_columns if i!=label]
        dfax = df.drop(drop_cols, axis=1)
        
        # Getting the cluster centroids and counts
        centroids = dfax.groupby(by=label, as_index=False).mean()
        counts = dfax.groupby(by=label, as_index=False).count().iloc[:,[0,1]]
        counts.columns = [label, "counts"]
        
        # Setting Data
        pd.plotting.parallel_coordinates(centroids, label, color=sns.color_palette(), ax=ax[0])
        sns.barplot(x=label, y="counts", data=counts, ax=ax[1])

        #Setting Layout
        handles, _ = ax[0].get_legend_handles_labels()
        cluster_labels = ["Cluster {}".format(i) for i in range(len(handles))]
#        ax[0].annotate(text=titl, xy=(0.95,1.1), xycoords='axes fraction', fontsize=13, fontweight = 'heavy') 
        ax[0].legend(handles, cluster_labels) # Adaptable to number of clusters
        ax[0].axhline(color="black", linestyle="--")
        ax[0].set_title("Cluster Means - {} Clusters".format(len(handles)), fontsize=13)
        ax[0].set_xticklabels(ax[0].get_xticklabels(), rotation=-20)
        ax[1].set_xticklabels(cluster_labels)
        ax[1].set_xlabel("")
        ax[1].set_ylabel("Absolute Frequency")
        ax[1].set_title("Cluster Sizes - {} Clusters".format(len(handles)), fontsize=13)
    
    plt.subplots_adjust(hspace=0.4, top=0.90)
    plt.suptitle("Cluster Simple Profilling", fontsize=23)
    plt.show()
    plt.savefig(os.path.join('cluster_profiles.png'), dpi=300)
In [187]:
# Profilling each cluster (product, behavior, merged)
cluster_profiles(
    df_kmeanspp, 
    label_columns = ['labelskmeans++'], 
    figsize = (28, 13), 
    compar_titles = ["cluster"]
)
<Figure size 576x396 with 0 Axes>

Cluster visualization using t-SNE

In [188]:
# This is step can be quite time consuming
two_dim = TSNE(random_state=42).fit_transform(df_kmeanspp)
In [189]:
# t-SNE visualization
pd.DataFrame(two_dim).plot.scatter(x=0, y=1, c=df_kmeanspp['labelskmeans++'], colormap='tab10', figsize=(15,10))
plt.savefig(os.path.join('t-sne.png'), dpi=300)
plt.show()
locator: <matplotlib.colorbar._ColorbarAutoLocator object at 0x00000185202DBE50>
Using auto colorbar locator on colorbar
locator: <matplotlib.colorbar._ColorbarAutoLocator object at 0x00000185202DBE50>
Setting pcolormesh
In [ ]:
 

SOM

In [241]:
# This som implementation does not have a random seed parameter
# We're going to set it up ourselves
np.random.seed(42)

sm = sompy.SOMFactory().build(
    clusterdataset_minmax_no_outliers.values, 
    mapsize=(5, 5),
    initialization='random', 
    neighborhood='gaussian',
    training='batch',
    lattice='hexa',
    component_names=metric_features_nmulticolinearete
)
sm.train(n_job=4, verbose='info', train_rough_len=100, train_finetune_len=100)
 Training...
 random_initialization took: 0.004000 seconds
 Rough training...
 radius_ini: 2.000000 , radius_final: 1.000000, trainlen: 100

 epoch: 1 ---> elapsed time:  0.223000, quantization error: 2.573410

 epoch: 2 ---> elapsed time:  0.129000, quantization error: 2.437031

 epoch: 3 ---> elapsed time:  0.126000, quantization error: 2.384797

 epoch: 4 ---> elapsed time:  0.122000, quantization error: 2.321628

 epoch: 5 ---> elapsed time:  0.121000, quantization error: 2.258950

 epoch: 6 ---> elapsed time:  0.124000, quantization error: 2.228403

 epoch: 7 ---> elapsed time:  0.141000, quantization error: 2.220397

 epoch: 8 ---> elapsed time:  0.149000, quantization error: 2.216689

 epoch: 9 ---> elapsed time:  0.122000, quantization error: 2.213390

 epoch: 10 ---> elapsed time:  0.122000, quantization error: 2.209901

 epoch: 11 ---> elapsed time:  0.128000, quantization error: 2.206724

 epoch: 12 ---> elapsed time:  0.123000, quantization error: 2.203901

 epoch: 13 ---> elapsed time:  0.119000, quantization error: 2.201303

 epoch: 14 ---> elapsed time:  0.138000, quantization error: 2.198858

 epoch: 15 ---> elapsed time:  0.119000, quantization error: 2.196459

 epoch: 16 ---> elapsed time:  0.122000, quantization error: 2.194048

 epoch: 17 ---> elapsed time:  0.122000, quantization error: 2.191599

 epoch: 18 ---> elapsed time:  0.123000, quantization error: 2.189111

 epoch: 19 ---> elapsed time:  0.120000, quantization error: 2.186573

 epoch: 20 ---> elapsed time:  0.128000, quantization error: 2.183997

 epoch: 21 ---> elapsed time:  0.124000, quantization error: 2.181377

 epoch: 22 ---> elapsed time:  0.123000, quantization error: 2.178703

 epoch: 23 ---> elapsed time:  0.127000, quantization error: 2.175969

 epoch: 24 ---> elapsed time:  0.130000, quantization error: 2.173196

 epoch: 25 ---> elapsed time:  0.124000, quantization error: 2.170385

 epoch: 26 ---> elapsed time:  0.125000, quantization error: 2.167541

 epoch: 27 ---> elapsed time:  0.120000, quantization error: 2.164663

 epoch: 28 ---> elapsed time:  0.117000, quantization error: 2.161740

 epoch: 29 ---> elapsed time:  0.129000, quantization error: 2.158789

 epoch: 30 ---> elapsed time:  0.143000, quantization error: 2.155805

 epoch: 31 ---> elapsed time:  0.128000, quantization error: 2.152788

 epoch: 32 ---> elapsed time:  0.124000, quantization error: 2.149726

 epoch: 33 ---> elapsed time:  0.127000, quantization error: 2.146615

 epoch: 34 ---> elapsed time:  0.126000, quantization error: 2.143468

 epoch: 35 ---> elapsed time:  0.121000, quantization error: 2.140264

 epoch: 36 ---> elapsed time:  0.130000, quantization error: 2.137033

 epoch: 37 ---> elapsed time:  0.127000, quantization error: 2.133765

 epoch: 38 ---> elapsed time:  0.125000, quantization error: 2.130473

 epoch: 39 ---> elapsed time:  0.117000, quantization error: 2.127131

 epoch: 40 ---> elapsed time:  0.127000, quantization error: 2.123756

 epoch: 41 ---> elapsed time:  0.126000, quantization error: 2.120359

 epoch: 42 ---> elapsed time:  0.125000, quantization error: 2.116922

 epoch: 43 ---> elapsed time:  0.118000, quantization error: 2.113444

 epoch: 44 ---> elapsed time:  0.123000, quantization error: 2.109912

 epoch: 45 ---> elapsed time:  0.122000, quantization error: 2.106331

 epoch: 46 ---> elapsed time:  0.121000, quantization error: 2.102700

 epoch: 47 ---> elapsed time:  0.126000, quantization error: 2.099040

 epoch: 48 ---> elapsed time:  0.141000, quantization error: 2.095352

 epoch: 49 ---> elapsed time:  0.140000, quantization error: 2.091631

 epoch: 50 ---> elapsed time:  0.123000, quantization error: 2.087885

 epoch: 51 ---> elapsed time:  0.120000, quantization error: 2.084100

 epoch: 52 ---> elapsed time:  0.121000, quantization error: 2.080260

 epoch: 53 ---> elapsed time:  0.123000, quantization error: 2.076383

 epoch: 54 ---> elapsed time:  0.121000, quantization error: 2.072463

 epoch: 55 ---> elapsed time:  0.117000, quantization error: 2.068504

 epoch: 56 ---> elapsed time:  0.121000, quantization error: 2.064483

 epoch: 57 ---> elapsed time:  0.129000, quantization error: 2.060393

 epoch: 58 ---> elapsed time:  0.126000, quantization error: 2.056190

 epoch: 59 ---> elapsed time:  0.127000, quantization error: 2.051747

 epoch: 60 ---> elapsed time:  0.133000, quantization error: 2.046864

 epoch: 61 ---> elapsed time:  0.146000, quantization error: 2.041560

 epoch: 62 ---> elapsed time:  0.121000, quantization error: 2.036139

 epoch: 63 ---> elapsed time:  0.119000, quantization error: 2.030671

 epoch: 64 ---> elapsed time:  0.126000, quantization error: 2.024792

 epoch: 65 ---> elapsed time:  0.121000, quantization error: 2.018020

 epoch: 66 ---> elapsed time:  0.128000, quantization error: 2.009389

 epoch: 67 ---> elapsed time:  0.124000, quantization error: 1.999043

 epoch: 68 ---> elapsed time:  0.129000, quantization error: 1.989891

 epoch: 69 ---> elapsed time:  0.123000, quantization error: 1.981973

 epoch: 70 ---> elapsed time:  0.124000, quantization error: 1.974700

 epoch: 71 ---> elapsed time:  0.122000, quantization error: 1.967779

 epoch: 72 ---> elapsed time:  0.130000, quantization error: 1.960809

 epoch: 73 ---> elapsed time:  0.126000, quantization error: 1.953533

 epoch: 74 ---> elapsed time:  0.125000, quantization error: 1.946125

 epoch: 75 ---> elapsed time:  0.123000, quantization error: 1.939063

 epoch: 76 ---> elapsed time:  0.130000, quantization error: 1.932441

 epoch: 77 ---> elapsed time:  0.130000, quantization error: 1.925995

 epoch: 78 ---> elapsed time:  0.130000, quantization error: 1.919588

 epoch: 79 ---> elapsed time:  0.133000, quantization error: 1.913225

 epoch: 80 ---> elapsed time:  0.132000, quantization error: 1.906872

 epoch: 81 ---> elapsed time:  0.137000, quantization error: 1.900510

 epoch: 82 ---> elapsed time:  0.128000, quantization error: 1.894119

 epoch: 83 ---> elapsed time:  0.127000, quantization error: 1.887688

 epoch: 84 ---> elapsed time:  0.132000, quantization error: 1.881228

 epoch: 85 ---> elapsed time:  0.121000, quantization error: 1.874731

 epoch: 86 ---> elapsed time:  0.124000, quantization error: 1.868214

 epoch: 87 ---> elapsed time:  0.120000, quantization error: 1.861640

 epoch: 88 ---> elapsed time:  0.117000, quantization error: 1.855011

 epoch: 89 ---> elapsed time:  0.150000, quantization error: 1.848364

 epoch: 90 ---> elapsed time:  0.130000, quantization error: 1.841676

 epoch: 91 ---> elapsed time:  0.117000, quantization error: 1.834924

 epoch: 92 ---> elapsed time:  0.122000, quantization error: 1.828109

 epoch: 93 ---> elapsed time:  0.117000, quantization error: 1.821201

 epoch: 94 ---> elapsed time:  0.118000, quantization error: 1.814221

 epoch: 95 ---> elapsed time:  0.127000, quantization error: 1.807174

 epoch: 96 ---> elapsed time:  0.130000, quantization error: 1.800057

 epoch: 97 ---> elapsed time:  0.127000, quantization error: 1.792848

 epoch: 98 ---> elapsed time:  0.126000, quantization error: 1.785446

 epoch: 99 ---> elapsed time:  0.135000, quantization error: 1.777747

 epoch: 100 ---> elapsed time:  0.120000, quantization error: 1.769608

 Finetune training...
 radius_ini: 1.000000 , radius_final: 1.000000, trainlen: 100

 epoch: 1 ---> elapsed time:  0.122000, quantization error: 1.761037

 epoch: 2 ---> elapsed time:  0.123000, quantization error: 1.760142

 epoch: 3 ---> elapsed time:  0.120000, quantization error: 1.759573

 epoch: 4 ---> elapsed time:  0.139000, quantization error: 1.759294

 epoch: 5 ---> elapsed time:  0.120000, quantization error: 1.759151

 epoch: 6 ---> elapsed time:  0.124000, quantization error: 1.759077

 epoch: 7 ---> elapsed time:  0.131000, quantization error: 1.759038

 epoch: 8 ---> elapsed time:  0.133000, quantization error: 1.759002

 epoch: 9 ---> elapsed time:  0.120000, quantization error: 1.758992

 epoch: 10 ---> elapsed time:  0.127000, quantization error: 1.758965

 epoch: 11 ---> elapsed time:  0.130000, quantization error: 1.758953

 epoch: 12 ---> elapsed time:  0.126000, quantization error: 1.758930

 epoch: 13 ---> elapsed time:  0.145000, quantization error: 1.758919

 epoch: 14 ---> elapsed time:  0.129000, quantization error: 1.758921

 epoch: 15 ---> elapsed time:  0.122000, quantization error: 1.758921

 epoch: 16 ---> elapsed time:  0.127000, quantization error: 1.758932

 epoch: 17 ---> elapsed time:  0.121000, quantization error: 1.758931

 epoch: 18 ---> elapsed time:  0.123000, quantization error: 1.758941

 epoch: 19 ---> elapsed time:  0.124000, quantization error: 1.758949

 epoch: 20 ---> elapsed time:  0.129000, quantization error: 1.758939

 epoch: 21 ---> elapsed time:  0.133000, quantization error: 1.758962

 epoch: 22 ---> elapsed time:  0.131000, quantization error: 1.758974

 epoch: 23 ---> elapsed time:  0.124000, quantization error: 1.758989

 epoch: 24 ---> elapsed time:  0.130000, quantization error: 1.758995

 epoch: 25 ---> elapsed time:  0.138000, quantization error: 1.759017

 epoch: 26 ---> elapsed time:  0.130000, quantization error: 1.759038

 epoch: 27 ---> elapsed time:  0.131000, quantization error: 1.759057

 epoch: 28 ---> elapsed time:  0.138000, quantization error: 1.759065

 epoch: 29 ---> elapsed time:  0.151000, quantization error: 1.759075

 epoch: 30 ---> elapsed time:  0.162000, quantization error: 1.759085

 epoch: 31 ---> elapsed time:  0.127000, quantization error: 1.759090

 epoch: 32 ---> elapsed time:  0.141000, quantization error: 1.759101

 epoch: 33 ---> elapsed time:  0.132000, quantization error: 1.759113

 epoch: 34 ---> elapsed time:  0.131000, quantization error: 1.759124

 epoch: 35 ---> elapsed time:  0.130000, quantization error: 1.759128

 epoch: 36 ---> elapsed time:  0.127000, quantization error: 1.759128

 epoch: 37 ---> elapsed time:  0.132000, quantization error: 1.759131

 epoch: 38 ---> elapsed time:  0.136000, quantization error: 1.759132

 epoch: 39 ---> elapsed time:  0.138000, quantization error: 1.759138

 epoch: 40 ---> elapsed time:  0.133000, quantization error: 1.759140

 epoch: 41 ---> elapsed time:  0.143000, quantization error: 1.759140

 epoch: 42 ---> elapsed time:  0.140000, quantization error: 1.759140

 epoch: 43 ---> elapsed time:  0.134000, quantization error: 1.759140

 epoch: 44 ---> elapsed time:  0.137000, quantization error: 1.759140

 epoch: 45 ---> elapsed time:  0.121000, quantization error: 1.759140

 epoch: 46 ---> elapsed time:  0.207000, quantization error: 1.759140

 epoch: 47 ---> elapsed time:  0.138000, quantization error: 1.759140

 epoch: 48 ---> elapsed time:  0.119000, quantization error: 1.759140

 epoch: 49 ---> elapsed time:  0.128000, quantization error: 1.759140

 epoch: 50 ---> elapsed time:  0.124000, quantization error: 1.759140

 epoch: 51 ---> elapsed time:  0.119000, quantization error: 1.759140

 epoch: 52 ---> elapsed time:  0.124000, quantization error: 1.759140

 epoch: 53 ---> elapsed time:  0.173000, quantization error: 1.759140

 epoch: 54 ---> elapsed time:  0.170000, quantization error: 1.759140

 epoch: 55 ---> elapsed time:  0.115000, quantization error: 1.759140

 epoch: 56 ---> elapsed time:  0.128000, quantization error: 1.759140

 epoch: 57 ---> elapsed time:  0.126000, quantization error: 1.759140

 epoch: 58 ---> elapsed time:  0.124000, quantization error: 1.759140

 epoch: 59 ---> elapsed time:  0.128000, quantization error: 1.759140

 epoch: 60 ---> elapsed time:  0.151000, quantization error: 1.759140

 epoch: 61 ---> elapsed time:  0.226000, quantization error: 1.759140

 epoch: 62 ---> elapsed time:  0.154000, quantization error: 1.759140

 epoch: 63 ---> elapsed time:  0.134000, quantization error: 1.759140

 epoch: 64 ---> elapsed time:  0.126000, quantization error: 1.759140

 epoch: 65 ---> elapsed time:  0.132000, quantization error: 1.759140

 epoch: 66 ---> elapsed time:  0.130000, quantization error: 1.759140

 epoch: 67 ---> elapsed time:  0.149000, quantization error: 1.759140

 epoch: 68 ---> elapsed time:  0.123000, quantization error: 1.759140

 epoch: 69 ---> elapsed time:  0.120000, quantization error: 1.759140

 epoch: 70 ---> elapsed time:  0.123000, quantization error: 1.759140

 epoch: 71 ---> elapsed time:  0.122000, quantization error: 1.759140

 epoch: 72 ---> elapsed time:  0.147000, quantization error: 1.759140

 epoch: 73 ---> elapsed time:  0.147000, quantization error: 1.759140

 epoch: 74 ---> elapsed time:  0.132000, quantization error: 1.759140

 epoch: 75 ---> elapsed time:  0.137000, quantization error: 1.759140

 epoch: 76 ---> elapsed time:  0.132000, quantization error: 1.759140

 epoch: 77 ---> elapsed time:  0.134000, quantization error: 1.759140

 epoch: 78 ---> elapsed time:  0.131000, quantization error: 1.759140

 epoch: 79 ---> elapsed time:  0.138000, quantization error: 1.759140

 epoch: 80 ---> elapsed time:  0.136000, quantization error: 1.759140

 epoch: 81 ---> elapsed time:  0.145000, quantization error: 1.759140

 epoch: 82 ---> elapsed time:  0.149000, quantization error: 1.759140

 epoch: 83 ---> elapsed time:  0.129000, quantization error: 1.759140

 epoch: 84 ---> elapsed time:  0.132000, quantization error: 1.759140

 epoch: 85 ---> elapsed time:  0.131000, quantization error: 1.759140

 epoch: 86 ---> elapsed time:  0.143000, quantization error: 1.759140

 epoch: 87 ---> elapsed time:  0.127000, quantization error: 1.759140

 epoch: 88 ---> elapsed time:  0.139000, quantization error: 1.759140

 epoch: 89 ---> elapsed time:  0.134000, quantization error: 1.759140

 epoch: 90 ---> elapsed time:  0.135000, quantization error: 1.759140

 epoch: 91 ---> elapsed time:  0.134000, quantization error: 1.759140

 epoch: 92 ---> elapsed time:  0.131000, quantization error: 1.759140

 epoch: 93 ---> elapsed time:  0.129000, quantization error: 1.759140

 epoch: 94 ---> elapsed time:  0.136000, quantization error: 1.759140

 epoch: 95 ---> elapsed time:  0.127000, quantization error: 1.759140

 epoch: 96 ---> elapsed time:  0.121000, quantization error: 1.759140

 epoch: 97 ---> elapsed time:  0.129000, quantization error: 1.759140

 epoch: 98 ---> elapsed time:  0.132000, quantization error: 1.759140

 epoch: 99 ---> elapsed time:  0.124000, quantization error: 1.759140

 epoch: 100 ---> elapsed time:  0.123000, quantization error: 1.759140

 Final quantization error: 1.759140
 train took: 26.287000 seconds
In [242]:
# Visualizing the Component planes (feature values)
sns.set()
view2D = View2D(12,12,"", text_size=10)
view2D.show(sm, col_sz=3, what='codebook')
plt.subplots_adjust(top=0.90)
plt.suptitle("Component Planes", fontsize=20)
plt.show()
In [243]:
# Here you have U-matrix
u = sompy.umatrix.UMatrixView(12, 12, 'umatrix', show_axis=True, text_size=8, show_text=True)

UMAT = u.show(
    sm, 
    distance2=1, 
    row_normalized=False, 
    show_data=True, 
    contooor=True, # Visualize isomorphic curves
    blob=False
)

UMAT[1]  # U-matrix values - no colorscale so we have to rely on the values :(
Out[243]:
array([[0.43790725, 0.45305855, 0.46583974, 0.46967471, 0.44393333],
       [0.44512788, 0.45023995, 0.47915641, 0.45303971, 0.45086826],
       [0.43462493, 0.48137302, 0.47058166, 0.39507731, 0.39228635],
       [0.53212123, 0.46328896, 0.43284132, 0.37403799, 0.36236787],
       [0.59386955, 0.52856757, 0.43993504, 0.3796591 , 0.33806833]])
In [244]:
vhts  = BmuHitsView(12,12,"Hits Map")
vhts.show(sm, anotate=True, onlyzeros=False, labelsize=12, cmap="Blues")
plt.show()
In [245]:
# This som implementation does not have a random seed parameter
# We're going to set it up ourselves
np.random.seed(42)

# Notice that the SOM did not converge - We're under a time constraint for this class
sm = sompy.SOMFactory().build(
    clusterdataset_minmax_no_outliers.values, 
    mapsize=(50, 50), 
    initialization='random',
    neighborhood='gaussian',
    training='batch',
    lattice='hexa',
    component_names=metric_features_nmulticolinearete
)
sm.train(n_job=-1, verbose='info', train_rough_len=300, train_finetune_len=300)
 Training...
 random_initialization took: 0.001000 seconds
 Rough training...
 radius_ini: 17.000000 , radius_final: 2.833333, trainlen: 300

 epoch: 1 ---> elapsed time:  1.729000, quantization error: 1.920281

 epoch: 2 ---> elapsed time:  1.781000, quantization error: 2.487635

 epoch: 3 ---> elapsed time:  1.652000, quantization error: 2.462823

 epoch: 4 ---> elapsed time:  1.725000, quantization error: 2.450570

 epoch: 5 ---> elapsed time:  1.822000, quantization error: 2.445981

 epoch: 6 ---> elapsed time:  1.684000, quantization error: 2.442768

 epoch: 7 ---> elapsed time:  1.749000, quantization error: 2.441085

 epoch: 8 ---> elapsed time:  1.838000, quantization error: 2.440469

 epoch: 9 ---> elapsed time:  1.660000, quantization error: 2.440097

 epoch: 10 ---> elapsed time:  1.639000, quantization error: 2.439729

 epoch: 11 ---> elapsed time:  1.719000, quantization error: 2.439365

 epoch: 12 ---> elapsed time:  1.709000, quantization error: 2.439016

 epoch: 13 ---> elapsed time:  1.698000, quantization error: 2.438667

 epoch: 14 ---> elapsed time:  1.738000, quantization error: 2.438317

 epoch: 15 ---> elapsed time:  1.776000, quantization error: 2.437966

 epoch: 16 ---> elapsed time:  1.817000, quantization error: 2.437611

 epoch: 17 ---> elapsed time:  1.916000, quantization error: 2.437254

 epoch: 18 ---> elapsed time:  1.764000, quantization error: 2.436893

 epoch: 19 ---> elapsed time:  1.688000, quantization error: 2.436530

 epoch: 20 ---> elapsed time:  1.650000, quantization error: 2.436164

 epoch: 21 ---> elapsed time:  1.744000, quantization error: 2.435795

 epoch: 22 ---> elapsed time:  1.785000, quantization error: 2.435423

 epoch: 23 ---> elapsed time:  1.659000, quantization error: 2.435048

 epoch: 24 ---> elapsed time:  1.689000, quantization error: 2.434670

 epoch: 25 ---> elapsed time:  1.787000, quantization error: 2.434288

 epoch: 26 ---> elapsed time:  1.853000, quantization error: 2.433904

 epoch: 27 ---> elapsed time:  1.835000, quantization error: 2.433516

 epoch: 28 ---> elapsed time:  1.656000, quantization error: 2.433125

 epoch: 29 ---> elapsed time:  1.801000, quantization error: 2.432730

 epoch: 30 ---> elapsed time:  1.680000, quantization error: 2.432333

 epoch: 31 ---> elapsed time:  1.730000, quantization error: 2.431932

 epoch: 32 ---> elapsed time:  1.640000, quantization error: 2.431527

 epoch: 33 ---> elapsed time:  1.703000, quantization error: 2.431119

 epoch: 34 ---> elapsed time:  1.938000, quantization error: 2.430708

 epoch: 35 ---> elapsed time:  1.909000, quantization error: 2.430293

 epoch: 36 ---> elapsed time:  1.763000, quantization error: 2.429874

 epoch: 37 ---> elapsed time:  1.855000, quantization error: 2.429453

 epoch: 38 ---> elapsed time:  1.687000, quantization error: 2.429027

 epoch: 39 ---> elapsed time:  1.731000, quantization error: 2.428598

 epoch: 40 ---> elapsed time:  1.815000, quantization error: 2.428165

 epoch: 41 ---> elapsed time:  1.697000, quantization error: 2.427728

 epoch: 42 ---> elapsed time:  1.639000, quantization error: 2.427287

 epoch: 43 ---> elapsed time:  1.949000, quantization error: 2.426843

 epoch: 44 ---> elapsed time:  1.972000, quantization error: 2.426395

 epoch: 45 ---> elapsed time:  1.845000, quantization error: 2.425942

 epoch: 46 ---> elapsed time:  1.891000, quantization error: 2.425487

 epoch: 47 ---> elapsed time:  1.704000, quantization error: 2.425026

 epoch: 48 ---> elapsed time:  1.731000, quantization error: 2.424562

 epoch: 49 ---> elapsed time:  1.753000, quantization error: 2.424094

 epoch: 50 ---> elapsed time:  1.598000, quantization error: 2.423622

 epoch: 51 ---> elapsed time:  1.640000, quantization error: 2.423145

 epoch: 52 ---> elapsed time:  1.696000, quantization error: 2.422664

 epoch: 53 ---> elapsed time:  1.889000, quantization error: 2.422179

 epoch: 54 ---> elapsed time:  1.830000, quantization error: 2.421690

 epoch: 55 ---> elapsed time:  1.643000, quantization error: 2.421196

 epoch: 56 ---> elapsed time:  1.717000, quantization error: 2.420697

 epoch: 57 ---> elapsed time:  1.624000, quantization error: 2.420195

 epoch: 58 ---> elapsed time:  1.601000, quantization error: 2.419688

 epoch: 59 ---> elapsed time:  1.618000, quantization error: 2.419176

 epoch: 60 ---> elapsed time:  1.633000, quantization error: 2.418659

 epoch: 61 ---> elapsed time:  1.689000, quantization error: 2.418138

 epoch: 62 ---> elapsed time:  1.866000, quantization error: 2.417612

 epoch: 63 ---> elapsed time:  1.863000, quantization error: 2.417082

 epoch: 64 ---> elapsed time:  1.675000, quantization error: 2.416546

 epoch: 65 ---> elapsed time:  1.747000, quantization error: 2.416005

 epoch: 66 ---> elapsed time:  1.751000, quantization error: 2.415460

 epoch: 67 ---> elapsed time:  1.666000, quantization error: 2.414909

 epoch: 68 ---> elapsed time:  1.695000, quantization error: 2.414354

 epoch: 69 ---> elapsed time:  1.780000, quantization error: 2.413793

 epoch: 70 ---> elapsed time:  1.720000, quantization error: 2.413227

 epoch: 71 ---> elapsed time:  1.729000, quantization error: 2.412656

 epoch: 72 ---> elapsed time:  1.949000, quantization error: 2.412079

 epoch: 73 ---> elapsed time:  1.641000, quantization error: 2.411497

 epoch: 74 ---> elapsed time:  1.614000, quantization error: 2.410910

 epoch: 75 ---> elapsed time:  1.663000, quantization error: 2.410317

 epoch: 76 ---> elapsed time:  1.933000, quantization error: 2.409719

 epoch: 77 ---> elapsed time:  1.729000, quantization error: 2.409115

 epoch: 78 ---> elapsed time:  1.771000, quantization error: 2.408505

 epoch: 79 ---> elapsed time:  1.817000, quantization error: 2.407889

 epoch: 80 ---> elapsed time:  1.789000, quantization error: 2.407268

 epoch: 81 ---> elapsed time:  1.800000, quantization error: 2.406640

 epoch: 82 ---> elapsed time:  1.717000, quantization error: 2.406007

 epoch: 83 ---> elapsed time:  1.678000, quantization error: 2.405367

 epoch: 84 ---> elapsed time:  1.693000, quantization error: 2.404722

 epoch: 85 ---> elapsed time:  1.722000, quantization error: 2.404070

 epoch: 86 ---> elapsed time:  1.681000, quantization error: 2.403412

 epoch: 87 ---> elapsed time:  1.635000, quantization error: 2.402748

 epoch: 88 ---> elapsed time:  1.698000, quantization error: 2.402077

 epoch: 89 ---> elapsed time:  1.731000, quantization error: 2.401399

 epoch: 90 ---> elapsed time:  1.645000, quantization error: 2.400715

 epoch: 91 ---> elapsed time:  1.701000, quantization error: 2.400024

 epoch: 92 ---> elapsed time:  1.684000, quantization error: 2.399327

 epoch: 93 ---> elapsed time:  1.590000, quantization error: 2.398623

 epoch: 94 ---> elapsed time:  1.565000, quantization error: 2.397911

 epoch: 95 ---> elapsed time:  1.620000, quantization error: 2.397193

 epoch: 96 ---> elapsed time:  1.651000, quantization error: 2.396468

 epoch: 97 ---> elapsed time:  1.576000, quantization error: 2.395735

 epoch: 98 ---> elapsed time:  1.677000, quantization error: 2.394996

 epoch: 99 ---> elapsed time:  1.689000, quantization error: 2.394249

 epoch: 100 ---> elapsed time:  1.584000, quantization error: 2.393494

 epoch: 101 ---> elapsed time:  1.579000, quantization error: 2.392732

 epoch: 102 ---> elapsed time:  1.608000, quantization error: 2.391962

 epoch: 103 ---> elapsed time:  1.629000, quantization error: 2.391185

 epoch: 104 ---> elapsed time:  1.585000, quantization error: 2.390400

 epoch: 105 ---> elapsed time:  1.641000, quantization error: 2.389606

 epoch: 106 ---> elapsed time:  1.582000, quantization error: 2.388805

 epoch: 107 ---> elapsed time:  1.552000, quantization error: 2.387996

 epoch: 108 ---> elapsed time:  1.622000, quantization error: 2.387179

 epoch: 109 ---> elapsed time:  1.652000, quantization error: 2.386353

 epoch: 110 ---> elapsed time:  1.681000, quantization error: 2.385519

 epoch: 111 ---> elapsed time:  1.776000, quantization error: 2.384676

 epoch: 112 ---> elapsed time:  1.806000, quantization error: 2.383825

 epoch: 113 ---> elapsed time:  1.961000, quantization error: 2.382965

 epoch: 114 ---> elapsed time:  1.873000, quantization error: 2.382096

 epoch: 115 ---> elapsed time:  2.056000, quantization error: 2.381218

 epoch: 116 ---> elapsed time:  1.756000, quantization error: 2.380332

 epoch: 117 ---> elapsed time:  2.018000, quantization error: 2.379436

 epoch: 118 ---> elapsed time:  1.736000, quantization error: 2.378531

 epoch: 119 ---> elapsed time:  1.811000, quantization error: 2.377616

 epoch: 120 ---> elapsed time:  1.786000, quantization error: 2.376692

 epoch: 121 ---> elapsed time:  1.781000, quantization error: 2.375758

 epoch: 122 ---> elapsed time:  1.689000, quantization error: 2.374813

 epoch: 123 ---> elapsed time:  1.875000, quantization error: 2.373859

 epoch: 124 ---> elapsed time:  1.748000, quantization error: 2.372895

 epoch: 125 ---> elapsed time:  1.658000, quantization error: 2.371921

 epoch: 126 ---> elapsed time:  1.953000, quantization error: 2.370937

 epoch: 127 ---> elapsed time:  1.861000, quantization error: 2.369942

 epoch: 128 ---> elapsed time:  1.806000, quantization error: 2.368937

 epoch: 129 ---> elapsed time:  1.871000, quantization error: 2.367921

 epoch: 130 ---> elapsed time:  1.814000, quantization error: 2.366895

 epoch: 131 ---> elapsed time:  1.744000, quantization error: 2.365857

 epoch: 132 ---> elapsed time:  1.749000, quantization error: 2.364809

 epoch: 133 ---> elapsed time:  1.698000, quantization error: 2.363749

 epoch: 134 ---> elapsed time:  1.831000, quantization error: 2.362679

 epoch: 135 ---> elapsed time:  1.836000, quantization error: 2.361597

 epoch: 136 ---> elapsed time:  1.796000, quantization error: 2.360503

 epoch: 137 ---> elapsed time:  1.870000, quantization error: 2.359398

 epoch: 138 ---> elapsed time:  1.919000, quantization error: 2.358280

 epoch: 139 ---> elapsed time:  1.853000, quantization error: 2.357151

 epoch: 140 ---> elapsed time:  1.728000, quantization error: 2.356010

 epoch: 141 ---> elapsed time:  1.817000, quantization error: 2.354856

 epoch: 142 ---> elapsed time:  1.752000, quantization error: 2.353691

 epoch: 143 ---> elapsed time:  1.997000, quantization error: 2.352513

 epoch: 144 ---> elapsed time:  2.080000, quantization error: 2.351322

 epoch: 145 ---> elapsed time:  2.152000, quantization error: 2.350118

 epoch: 146 ---> elapsed time:  1.835000, quantization error: 2.348902

 epoch: 147 ---> elapsed time:  1.783000, quantization error: 2.347672

 epoch: 148 ---> elapsed time:  1.742000, quantization error: 2.346429

 epoch: 149 ---> elapsed time:  1.691000, quantization error: 2.345173

 epoch: 150 ---> elapsed time:  1.754000, quantization error: 2.343904

 epoch: 151 ---> elapsed time:  1.631000, quantization error: 2.342620

 epoch: 152 ---> elapsed time:  1.758000, quantization error: 2.341322

 epoch: 153 ---> elapsed time:  1.705000, quantization error: 2.340011

 epoch: 154 ---> elapsed time:  1.644000, quantization error: 2.338686

 epoch: 155 ---> elapsed time:  1.590000, quantization error: 2.337346

 epoch: 156 ---> elapsed time:  1.640000, quantization error: 2.335990

 epoch: 157 ---> elapsed time:  1.650000, quantization error: 2.334620

 epoch: 158 ---> elapsed time:  1.561000, quantization error: 2.333234

 epoch: 159 ---> elapsed time:  1.926000, quantization error: 2.331833

 epoch: 160 ---> elapsed time:  1.756000, quantization error: 2.330416

 epoch: 161 ---> elapsed time:  1.660000, quantization error: 2.328982

 epoch: 162 ---> elapsed time:  1.796000, quantization error: 2.327533

 epoch: 163 ---> elapsed time:  1.760000, quantization error: 2.326068

 epoch: 164 ---> elapsed time:  1.811000, quantization error: 2.324586

 epoch: 165 ---> elapsed time:  1.737000, quantization error: 2.323087

 epoch: 166 ---> elapsed time:  1.693000, quantization error: 2.321571

 epoch: 167 ---> elapsed time:  1.668000, quantization error: 2.320038

 epoch: 168 ---> elapsed time:  1.702000, quantization error: 2.318486

 epoch: 169 ---> elapsed time:  1.683000, quantization error: 2.316918

 epoch: 170 ---> elapsed time:  1.698000, quantization error: 2.315330

 epoch: 171 ---> elapsed time:  1.665000, quantization error: 2.313725

 epoch: 172 ---> elapsed time:  1.717000, quantization error: 2.312101

 epoch: 173 ---> elapsed time:  1.748000, quantization error: 2.310460

 epoch: 174 ---> elapsed time:  1.569000, quantization error: 2.308798

 epoch: 175 ---> elapsed time:  1.629000, quantization error: 2.307118

 epoch: 176 ---> elapsed time:  1.623000, quantization error: 2.305418

 epoch: 177 ---> elapsed time:  1.580000, quantization error: 2.303698

 epoch: 178 ---> elapsed time:  1.602000, quantization error: 2.301958

 epoch: 179 ---> elapsed time:  1.641000, quantization error: 2.300198

 epoch: 180 ---> elapsed time:  1.645000, quantization error: 2.298416

 epoch: 181 ---> elapsed time:  1.671000, quantization error: 2.296614

 epoch: 182 ---> elapsed time:  1.641000, quantization error: 2.294790

 epoch: 183 ---> elapsed time:  1.672000, quantization error: 2.292945

 epoch: 184 ---> elapsed time:  1.550000, quantization error: 2.291077

 epoch: 185 ---> elapsed time:  1.571000, quantization error: 2.289187

 epoch: 186 ---> elapsed time:  1.605000, quantization error: 2.287275

 epoch: 187 ---> elapsed time:  1.777000, quantization error: 2.285339

 epoch: 188 ---> elapsed time:  1.679000, quantization error: 2.283379

 epoch: 189 ---> elapsed time:  1.689000, quantization error: 2.281395

 epoch: 190 ---> elapsed time:  1.750000, quantization error: 2.279385

 epoch: 191 ---> elapsed time:  1.772000, quantization error: 2.277328

 epoch: 192 ---> elapsed time:  2.179000, quantization error: 2.275234

 epoch: 193 ---> elapsed time:  2.122000, quantization error: 2.273138

 epoch: 194 ---> elapsed time:  1.599000, quantization error: 2.271025

 epoch: 195 ---> elapsed time:  1.614000, quantization error: 2.268890

 epoch: 196 ---> elapsed time:  1.622000, quantization error: 2.266731

 epoch: 197 ---> elapsed time:  2.055000, quantization error: 2.264545

 epoch: 198 ---> elapsed time:  1.912000, quantization error: 2.262333

 epoch: 199 ---> elapsed time:  1.737000, quantization error: 2.260095

 epoch: 200 ---> elapsed time:  1.826000, quantization error: 2.257829

 epoch: 201 ---> elapsed time:  2.205000, quantization error: 2.255531

 epoch: 202 ---> elapsed time:  2.262000, quantization error: 2.253207

 epoch: 203 ---> elapsed time:  1.939000, quantization error: 2.250854

 epoch: 204 ---> elapsed time:  1.784000, quantization error: 2.248469

 epoch: 205 ---> elapsed time:  1.881000, quantization error: 2.246049

 epoch: 206 ---> elapsed time:  1.734000, quantization error: 2.243592

 epoch: 207 ---> elapsed time:  1.794000, quantization error: 2.241101

 epoch: 208 ---> elapsed time:  1.918000, quantization error: 2.238585

 epoch: 209 ---> elapsed time:  2.097000, quantization error: 2.236045

 epoch: 210 ---> elapsed time:  1.740000, quantization error: 2.233487

 epoch: 211 ---> elapsed time:  1.785000, quantization error: 2.230909

 epoch: 212 ---> elapsed time:  1.741000, quantization error: 2.228307

 epoch: 213 ---> elapsed time:  1.654000, quantization error: 2.225681

 epoch: 214 ---> elapsed time:  1.608000, quantization error: 2.223029

 epoch: 215 ---> elapsed time:  1.754000, quantization error: 2.220340

 epoch: 216 ---> elapsed time:  1.591000, quantization error: 2.217616

 epoch: 217 ---> elapsed time:  1.926000, quantization error: 2.214861

 epoch: 218 ---> elapsed time:  1.945000, quantization error: 2.212055

 epoch: 219 ---> elapsed time:  1.719000, quantization error: 2.209128

 epoch: 220 ---> elapsed time:  1.781000, quantization error: 2.206118

 epoch: 221 ---> elapsed time:  1.813000, quantization error: 2.203119

 epoch: 222 ---> elapsed time:  1.731000, quantization error: 2.200092

 epoch: 223 ---> elapsed time:  1.846000, quantization error: 2.197057

 epoch: 224 ---> elapsed time:  1.813000, quantization error: 2.193997

 epoch: 225 ---> elapsed time:  1.856000, quantization error: 2.190856

 epoch: 226 ---> elapsed time:  1.772000, quantization error: 2.187696

 epoch: 227 ---> elapsed time:  1.842000, quantization error: 2.184555

 epoch: 228 ---> elapsed time:  1.742000, quantization error: 2.181342

 epoch: 229 ---> elapsed time:  1.709000, quantization error: 2.178045

 epoch: 230 ---> elapsed time:  1.731000, quantization error: 2.174724

 epoch: 231 ---> elapsed time:  1.714000, quantization error: 2.171415

 epoch: 232 ---> elapsed time:  1.713000, quantization error: 2.168049

 epoch: 233 ---> elapsed time:  1.656000, quantization error: 2.164586

 epoch: 234 ---> elapsed time:  1.822000, quantization error: 2.161078

 epoch: 235 ---> elapsed time:  1.804000, quantization error: 2.157550

 epoch: 236 ---> elapsed time:  1.754000, quantization error: 2.153795

 epoch: 237 ---> elapsed time:  1.745000, quantization error: 2.149136

 epoch: 238 ---> elapsed time:  1.700000, quantization error: 2.143384

 epoch: 239 ---> elapsed time:  1.741000, quantization error: 2.136970

 epoch: 240 ---> elapsed time:  1.742000, quantization error: 2.130960

 epoch: 241 ---> elapsed time:  2.149000, quantization error: 2.125658

 epoch: 242 ---> elapsed time:  2.283000, quantization error: 2.120357

 epoch: 243 ---> elapsed time:  1.952000, quantization error: 2.115141

 epoch: 244 ---> elapsed time:  1.969000, quantization error: 2.110131

 epoch: 245 ---> elapsed time:  2.165000, quantization error: 2.105278

 epoch: 246 ---> elapsed time:  2.087000, quantization error: 2.100411

 epoch: 247 ---> elapsed time:  1.832000, quantization error: 2.095536

 epoch: 248 ---> elapsed time:  1.707000, quantization error: 2.090548

 epoch: 249 ---> elapsed time:  1.696000, quantization error: 2.085415

 epoch: 250 ---> elapsed time:  1.720000, quantization error: 2.080221

 epoch: 251 ---> elapsed time:  1.700000, quantization error: 2.074826

 epoch: 252 ---> elapsed time:  1.845000, quantization error: 2.069215

 epoch: 253 ---> elapsed time:  1.757000, quantization error: 2.063720

 epoch: 254 ---> elapsed time:  1.716000, quantization error: 2.058463

 epoch: 255 ---> elapsed time:  1.623000, quantization error: 2.053346

 epoch: 256 ---> elapsed time:  1.677000, quantization error: 2.048153

 epoch: 257 ---> elapsed time:  1.821000, quantization error: 2.042380

 epoch: 258 ---> elapsed time:  1.738000, quantization error: 2.036356

 epoch: 259 ---> elapsed time:  1.670000, quantization error: 2.030538

 epoch: 260 ---> elapsed time:  1.698000, quantization error: 2.024892

 epoch: 261 ---> elapsed time:  1.847000, quantization error: 2.019065

 epoch: 262 ---> elapsed time:  1.683000, quantization error: 2.012805

 epoch: 263 ---> elapsed time:  1.815000, quantization error: 2.006528

 epoch: 264 ---> elapsed time:  1.826000, quantization error: 2.000353

 epoch: 265 ---> elapsed time:  1.659000, quantization error: 1.994103

 epoch: 266 ---> elapsed time:  1.790000, quantization error: 1.987917

 epoch: 267 ---> elapsed time:  1.912000, quantization error: 1.981830

 epoch: 268 ---> elapsed time:  1.723000, quantization error: 1.975706

 epoch: 269 ---> elapsed time:  1.723000, quantization error: 1.968955

 epoch: 270 ---> elapsed time:  1.997000, quantization error: 1.961389

 epoch: 271 ---> elapsed time:  1.826000, quantization error: 1.953736

 epoch: 272 ---> elapsed time:  1.833000, quantization error: 1.946130

 epoch: 273 ---> elapsed time:  1.816000, quantization error: 1.938755

 epoch: 274 ---> elapsed time:  1.789000, quantization error: 1.931358

 epoch: 275 ---> elapsed time:  1.767000, quantization error: 1.923475

 epoch: 276 ---> elapsed time:  1.740000, quantization error: 1.914798

 epoch: 277 ---> elapsed time:  1.790000, quantization error: 1.906721

 epoch: 278 ---> elapsed time:  1.790000, quantization error: 1.898327

 epoch: 279 ---> elapsed time:  1.933000, quantization error: 1.888736

 epoch: 280 ---> elapsed time:  1.846000, quantization error: 1.879255

 epoch: 281 ---> elapsed time:  1.772000, quantization error: 1.869817

 epoch: 282 ---> elapsed time:  1.750000, quantization error: 1.858913

 epoch: 283 ---> elapsed time:  1.900000, quantization error: 1.848519

 epoch: 284 ---> elapsed time:  1.900000, quantization error: 1.838000

 epoch: 285 ---> elapsed time:  1.869000, quantization error: 1.826520

 epoch: 286 ---> elapsed time:  1.699000, quantization error: 1.814580

 epoch: 287 ---> elapsed time:  1.887000, quantization error: 1.802527

 epoch: 288 ---> elapsed time:  1.931000, quantization error: 1.790320

 epoch: 289 ---> elapsed time:  1.905000, quantization error: 1.777376

 epoch: 290 ---> elapsed time:  1.739000, quantization error: 1.764269

 epoch: 291 ---> elapsed time:  2.014000, quantization error: 1.751198

 epoch: 292 ---> elapsed time:  1.779000, quantization error: 1.738508

 epoch: 293 ---> elapsed time:  1.845000, quantization error: 1.727023

 epoch: 294 ---> elapsed time:  1.766000, quantization error: 1.715435

 epoch: 295 ---> elapsed time:  1.961000, quantization error: 1.703618

 epoch: 296 ---> elapsed time:  2.080000, quantization error: 1.691999

 epoch: 297 ---> elapsed time:  2.098000, quantization error: 1.680591

 epoch: 298 ---> elapsed time:  1.725000, quantization error: 1.669142

 epoch: 299 ---> elapsed time:  1.872000, quantization error: 1.657479

 epoch: 300 ---> elapsed time:  1.764000, quantization error: 1.645821

 Finetune training...
 radius_ini: 4.166667 , radius_final: 1.000000, trainlen: 300

 epoch: 1 ---> elapsed time:  1.720000, quantization error: 1.634076

 epoch: 2 ---> elapsed time:  1.751000, quantization error: 1.920877

 epoch: 3 ---> elapsed time:  1.909000, quantization error: 1.908382

 epoch: 4 ---> elapsed time:  1.718000, quantization error: 1.903488

 epoch: 5 ---> elapsed time:  1.883000, quantization error: 1.899873

 epoch: 6 ---> elapsed time:  1.981000, quantization error: 1.897055

 epoch: 7 ---> elapsed time:  1.814000, quantization error: 1.894730

 epoch: 8 ---> elapsed time:  1.809000, quantization error: 1.892685

 epoch: 9 ---> elapsed time:  1.714000, quantization error: 1.890707

 epoch: 10 ---> elapsed time:  1.695000, quantization error: 1.888675

 epoch: 11 ---> elapsed time:  1.660000, quantization error: 1.886528

 epoch: 12 ---> elapsed time:  1.737000, quantization error: 1.884410

 epoch: 13 ---> elapsed time:  1.949000, quantization error: 1.882390

 epoch: 14 ---> elapsed time:  1.741000, quantization error: 1.880379

 epoch: 15 ---> elapsed time:  1.707000, quantization error: 1.878308

 epoch: 16 ---> elapsed time:  1.639000, quantization error: 1.876174

 epoch: 17 ---> elapsed time:  1.650000, quantization error: 1.874042

 epoch: 18 ---> elapsed time:  1.698000, quantization error: 1.871952

 epoch: 19 ---> elapsed time:  1.724000, quantization error: 1.869886

 epoch: 20 ---> elapsed time:  1.693000, quantization error: 1.867763

 epoch: 21 ---> elapsed time:  1.922000, quantization error: 1.865585

 epoch: 22 ---> elapsed time:  1.904000, quantization error: 1.863390

 epoch: 23 ---> elapsed time:  1.753000, quantization error: 1.861176

 epoch: 24 ---> elapsed time:  1.761000, quantization error: 1.858903

 epoch: 25 ---> elapsed time:  1.838000, quantization error: 1.856527

 epoch: 26 ---> elapsed time:  1.862000, quantization error: 1.854051

 epoch: 27 ---> elapsed time:  1.708000, quantization error: 1.851647

 epoch: 28 ---> elapsed time:  1.954000, quantization error: 1.849287

 epoch: 29 ---> elapsed time:  1.865000, quantization error: 1.846934

 epoch: 30 ---> elapsed time:  1.775000, quantization error: 1.844583

 epoch: 31 ---> elapsed time:  1.913000, quantization error: 1.842228

 epoch: 32 ---> elapsed time:  2.078000, quantization error: 1.839791

 epoch: 33 ---> elapsed time:  1.985000, quantization error: 1.837373

 epoch: 34 ---> elapsed time:  1.905000, quantization error: 1.834993

 epoch: 35 ---> elapsed time:  1.891000, quantization error: 1.832623

 epoch: 36 ---> elapsed time:  1.907000, quantization error: 1.830264

 epoch: 37 ---> elapsed time:  1.855000, quantization error: 1.827832

 epoch: 38 ---> elapsed time:  1.790000, quantization error: 1.825344

 epoch: 39 ---> elapsed time:  1.773000, quantization error: 1.822768

 epoch: 40 ---> elapsed time:  1.889000, quantization error: 1.820167

 epoch: 41 ---> elapsed time:  1.782000, quantization error: 1.817672

 epoch: 42 ---> elapsed time:  1.690000, quantization error: 1.815286

 epoch: 43 ---> elapsed time:  1.904000, quantization error: 1.812990

 epoch: 44 ---> elapsed time:  1.731000, quantization error: 1.810771

 epoch: 45 ---> elapsed time:  1.755000, quantization error: 1.808584

 epoch: 46 ---> elapsed time:  1.655000, quantization error: 1.806432

 epoch: 47 ---> elapsed time:  2.065000, quantization error: 1.804299

 epoch: 48 ---> elapsed time:  2.097000, quantization error: 1.802185

 epoch: 49 ---> elapsed time:  1.881000, quantization error: 1.800028

 epoch: 50 ---> elapsed time:  1.761000, quantization error: 1.797853

 epoch: 51 ---> elapsed time:  2.221000, quantization error: 1.795680

 epoch: 52 ---> elapsed time:  2.064000, quantization error: 1.793459

 epoch: 53 ---> elapsed time:  1.712000, quantization error: 1.791223

 epoch: 54 ---> elapsed time:  1.698000, quantization error: 1.788919

 epoch: 55 ---> elapsed time:  1.738000, quantization error: 1.786571

 epoch: 56 ---> elapsed time:  1.803000, quantization error: 1.784258

 epoch: 57 ---> elapsed time:  1.891000, quantization error: 1.781999

 epoch: 58 ---> elapsed time:  1.879000, quantization error: 1.779776

 epoch: 59 ---> elapsed time:  1.941000, quantization error: 1.777517

 epoch: 60 ---> elapsed time:  1.773000, quantization error: 1.775245

 epoch: 61 ---> elapsed time:  1.639000, quantization error: 1.772969

 epoch: 62 ---> elapsed time:  1.614000, quantization error: 1.770675

 epoch: 63 ---> elapsed time:  1.571000, quantization error: 1.768369

 epoch: 64 ---> elapsed time:  1.691000, quantization error: 1.766056

 epoch: 65 ---> elapsed time:  1.797000, quantization error: 1.763730

 epoch: 66 ---> elapsed time:  1.638000, quantization error: 1.761354

 epoch: 67 ---> elapsed time:  1.778000, quantization error: 1.758918

 epoch: 68 ---> elapsed time:  1.727000, quantization error: 1.756391

 epoch: 69 ---> elapsed time:  1.723000, quantization error: 1.753746

 epoch: 70 ---> elapsed time:  1.689000, quantization error: 1.751078

 epoch: 71 ---> elapsed time:  1.846000, quantization error: 1.748465

 epoch: 72 ---> elapsed time:  1.647000, quantization error: 1.745932

 epoch: 73 ---> elapsed time:  1.681000, quantization error: 1.743405

 epoch: 74 ---> elapsed time:  1.704000, quantization error: 1.740857

 epoch: 75 ---> elapsed time:  1.785000, quantization error: 1.738329

 epoch: 76 ---> elapsed time:  1.760000, quantization error: 1.735819

 epoch: 77 ---> elapsed time:  1.812000, quantization error: 1.733349

 epoch: 78 ---> elapsed time:  1.938000, quantization error: 1.730908

 epoch: 79 ---> elapsed time:  2.182000, quantization error: 1.728450

 epoch: 80 ---> elapsed time:  1.864000, quantization error: 1.725983

 epoch: 81 ---> elapsed time:  1.919000, quantization error: 1.723516

 epoch: 82 ---> elapsed time:  1.738000, quantization error: 1.721035

 epoch: 83 ---> elapsed time:  1.792000, quantization error: 1.718546

 epoch: 84 ---> elapsed time:  1.770000, quantization error: 1.716064

 epoch: 85 ---> elapsed time:  1.852000, quantization error: 1.713577

 epoch: 86 ---> elapsed time:  1.768000, quantization error: 1.711101

 epoch: 87 ---> elapsed time:  1.664000, quantization error: 1.708616

 epoch: 88 ---> elapsed time:  1.690000, quantization error: 1.706130

 epoch: 89 ---> elapsed time:  1.590000, quantization error: 1.703620

 epoch: 90 ---> elapsed time:  1.736000, quantization error: 1.701109

 epoch: 91 ---> elapsed time:  1.699000, quantization error: 1.698571

 epoch: 92 ---> elapsed time:  1.731000, quantization error: 1.696020

 epoch: 93 ---> elapsed time:  1.735000, quantization error: 1.693463

 epoch: 94 ---> elapsed time:  1.671000, quantization error: 1.690882

 epoch: 95 ---> elapsed time:  1.761000, quantization error: 1.688292

 epoch: 96 ---> elapsed time:  1.883000, quantization error: 1.685670

 epoch: 97 ---> elapsed time:  2.107000, quantization error: 1.682990

 epoch: 98 ---> elapsed time:  2.033000, quantization error: 1.680261

 epoch: 99 ---> elapsed time:  2.002000, quantization error: 1.677515

 epoch: 100 ---> elapsed time:  1.705000, quantization error: 1.674749

 epoch: 101 ---> elapsed time:  1.772000, quantization error: 1.671926

 epoch: 102 ---> elapsed time:  2.110000, quantization error: 1.669024

 epoch: 103 ---> elapsed time:  1.796000, quantization error: 1.666106

 epoch: 104 ---> elapsed time:  2.252000, quantization error: 1.663148

 epoch: 105 ---> elapsed time:  2.401000, quantization error: 1.660290

 epoch: 106 ---> elapsed time:  2.052000, quantization error: 1.657380

 epoch: 107 ---> elapsed time:  1.954000, quantization error: 1.654405

 epoch: 108 ---> elapsed time:  1.695000, quantization error: 1.651391

 epoch: 109 ---> elapsed time:  1.643000, quantization error: 1.648288

 epoch: 110 ---> elapsed time:  1.847000, quantization error: 1.645099

 epoch: 111 ---> elapsed time:  1.883000, quantization error: 1.641662

 epoch: 112 ---> elapsed time:  1.779000, quantization error: 1.637838

 epoch: 113 ---> elapsed time:  1.785000, quantization error: 1.634134

 epoch: 114 ---> elapsed time:  1.746000, quantization error: 1.630251

 epoch: 115 ---> elapsed time:  1.891000, quantization error: 1.626236

 epoch: 116 ---> elapsed time:  1.686000, quantization error: 1.622380

 epoch: 117 ---> elapsed time:  1.905000, quantization error: 1.618332

 epoch: 118 ---> elapsed time:  2.107000, quantization error: 1.613902

 epoch: 119 ---> elapsed time:  2.086000, quantization error: 1.609592

 epoch: 120 ---> elapsed time:  2.115000, quantization error: 1.605522

 epoch: 121 ---> elapsed time:  1.900000, quantization error: 1.601680

 epoch: 122 ---> elapsed time:  1.983000, quantization error: 1.597993

 epoch: 123 ---> elapsed time:  1.847000, quantization error: 1.594245

 epoch: 124 ---> elapsed time:  1.603000, quantization error: 1.590413

 epoch: 125 ---> elapsed time:  1.714000, quantization error: 1.586381

 epoch: 126 ---> elapsed time:  1.603000, quantization error: 1.582045

 epoch: 127 ---> elapsed time:  1.827000, quantization error: 1.577506

 epoch: 128 ---> elapsed time:  1.702000, quantization error: 1.572753

 epoch: 129 ---> elapsed time:  1.691000, quantization error: 1.568093

 epoch: 130 ---> elapsed time:  1.757000, quantization error: 1.563516

 epoch: 131 ---> elapsed time:  1.621000, quantization error: 1.558823

 epoch: 132 ---> elapsed time:  1.740000, quantization error: 1.554039

 epoch: 133 ---> elapsed time:  1.799000, quantization error: 1.549470

 epoch: 134 ---> elapsed time:  1.716000, quantization error: 1.545074

 epoch: 135 ---> elapsed time:  1.679000, quantization error: 1.540925

 epoch: 136 ---> elapsed time:  1.846000, quantization error: 1.536897

 epoch: 137 ---> elapsed time:  1.826000, quantization error: 1.532941

 epoch: 138 ---> elapsed time:  1.829000, quantization error: 1.529047

 epoch: 139 ---> elapsed time:  1.670000, quantization error: 1.525198

 epoch: 140 ---> elapsed time:  1.615000, quantization error: 1.521375

 epoch: 141 ---> elapsed time:  1.658000, quantization error: 1.517577

 epoch: 142 ---> elapsed time:  1.721000, quantization error: 1.513785

 epoch: 143 ---> elapsed time:  1.693000, quantization error: 1.509986

 epoch: 144 ---> elapsed time:  1.656000, quantization error: 1.506193

 epoch: 145 ---> elapsed time:  1.728000, quantization error: 1.502480

 epoch: 146 ---> elapsed time:  1.792000, quantization error: 1.498786

 epoch: 147 ---> elapsed time:  1.636000, quantization error: 1.495091

 epoch: 148 ---> elapsed time:  1.654000, quantization error: 1.491369

 epoch: 149 ---> elapsed time:  1.753000, quantization error: 1.487642

 epoch: 150 ---> elapsed time:  1.636000, quantization error: 1.483901

 epoch: 151 ---> elapsed time:  1.643000, quantization error: 1.480163

 epoch: 152 ---> elapsed time:  1.693000, quantization error: 1.476446

 epoch: 153 ---> elapsed time:  1.725000, quantization error: 1.472744

 epoch: 154 ---> elapsed time:  1.704000, quantization error: 1.469032

 epoch: 155 ---> elapsed time:  1.773000, quantization error: 1.465307

 epoch: 156 ---> elapsed time:  1.853000, quantization error: 1.461536

 epoch: 157 ---> elapsed time:  1.775000, quantization error: 1.457745

 epoch: 158 ---> elapsed time:  1.721000, quantization error: 1.453892

 epoch: 159 ---> elapsed time:  1.898000, quantization error: 1.449996

 epoch: 160 ---> elapsed time:  1.756000, quantization error: 1.445995

 epoch: 161 ---> elapsed time:  1.829000, quantization error: 1.442032

 epoch: 162 ---> elapsed time:  1.760000, quantization error: 1.438234

 epoch: 163 ---> elapsed time:  1.763000, quantization error: 1.434515

 epoch: 164 ---> elapsed time:  1.854000, quantization error: 1.430740

 epoch: 165 ---> elapsed time:  2.018000, quantization error: 1.426958

 epoch: 166 ---> elapsed time:  1.823000, quantization error: 1.423192

 epoch: 167 ---> elapsed time:  1.907000, quantization error: 1.419437

 epoch: 168 ---> elapsed time:  1.826000, quantization error: 1.415713

 epoch: 169 ---> elapsed time:  1.701000, quantization error: 1.411985

 epoch: 170 ---> elapsed time:  1.721000, quantization error: 1.408238

 epoch: 171 ---> elapsed time:  1.786000, quantization error: 1.404473

 epoch: 172 ---> elapsed time:  1.698000, quantization error: 1.400662

 epoch: 173 ---> elapsed time:  1.955000, quantization error: 1.396845

 epoch: 174 ---> elapsed time:  1.794000, quantization error: 1.393049

 epoch: 175 ---> elapsed time:  1.854000, quantization error: 1.389269

 epoch: 176 ---> elapsed time:  1.726000, quantization error: 1.385513

 epoch: 177 ---> elapsed time:  1.708000, quantization error: 1.381741

 epoch: 178 ---> elapsed time:  1.704000, quantization error: 1.377956

 epoch: 179 ---> elapsed time:  1.586000, quantization error: 1.374132

 epoch: 180 ---> elapsed time:  1.627000, quantization error: 1.370294

 epoch: 181 ---> elapsed time:  1.687000, quantization error: 1.366410

 epoch: 182 ---> elapsed time:  1.749000, quantization error: 1.362509

 epoch: 183 ---> elapsed time:  1.791000, quantization error: 1.358510

 epoch: 184 ---> elapsed time:  1.955000, quantization error: 1.354538

 epoch: 185 ---> elapsed time:  1.727000, quantization error: 1.350538

 epoch: 186 ---> elapsed time:  1.727000, quantization error: 1.346390

 epoch: 187 ---> elapsed time:  1.680000, quantization error: 1.342207

 epoch: 188 ---> elapsed time:  1.716000, quantization error: 1.338091

 epoch: 189 ---> elapsed time:  1.699000, quantization error: 1.334033

 epoch: 190 ---> elapsed time:  1.622000, quantization error: 1.329936

 epoch: 191 ---> elapsed time:  1.799000, quantization error: 1.325826

 epoch: 192 ---> elapsed time:  1.800000, quantization error: 1.321695

 epoch: 193 ---> elapsed time:  1.683000, quantization error: 1.317546

 epoch: 194 ---> elapsed time:  1.960000, quantization error: 1.313373

 epoch: 195 ---> elapsed time:  1.798000, quantization error: 1.309139

 epoch: 196 ---> elapsed time:  1.796000, quantization error: 1.304730

 epoch: 197 ---> elapsed time:  2.057000, quantization error: 1.300191

 epoch: 198 ---> elapsed time:  2.257000, quantization error: 1.295666

 epoch: 199 ---> elapsed time:  1.772000, quantization error: 1.291230

 epoch: 200 ---> elapsed time:  1.974000, quantization error: 1.286885

 epoch: 201 ---> elapsed time:  2.258000, quantization error: 1.282534

 epoch: 202 ---> elapsed time:  1.842000, quantization error: 1.278175

 epoch: 203 ---> elapsed time:  1.810000, quantization error: 1.273859

 epoch: 204 ---> elapsed time:  2.005000, quantization error: 1.269675

 epoch: 205 ---> elapsed time:  1.788000, quantization error: 1.265566

 epoch: 206 ---> elapsed time:  1.746000, quantization error: 1.261453

 epoch: 207 ---> elapsed time:  1.690000, quantization error: 1.257288

 epoch: 208 ---> elapsed time:  1.857000, quantization error: 1.253086

 epoch: 209 ---> elapsed time:  1.868000, quantization error: 1.248850

 epoch: 210 ---> elapsed time:  2.125000, quantization error: 1.244660

 epoch: 211 ---> elapsed time:  1.955000, quantization error: 1.240345

 epoch: 212 ---> elapsed time:  1.835000, quantization error: 1.235958

 epoch: 213 ---> elapsed time:  1.873000, quantization error: 1.231597

 epoch: 214 ---> elapsed time:  1.831000, quantization error: 1.227204

 epoch: 215 ---> elapsed time:  1.759000, quantization error: 1.222675

 epoch: 216 ---> elapsed time:  1.681000, quantization error: 1.218142

 epoch: 217 ---> elapsed time:  1.801000, quantization error: 1.213681

 epoch: 218 ---> elapsed time:  1.809000, quantization error: 1.209214

 epoch: 219 ---> elapsed time:  1.780000, quantization error: 1.204723

 epoch: 220 ---> elapsed time:  1.785000, quantization error: 1.200155

 epoch: 221 ---> elapsed time:  1.679000, quantization error: 1.195534

 epoch: 222 ---> elapsed time:  1.648000, quantization error: 1.190823

 epoch: 223 ---> elapsed time:  1.642000, quantization error: 1.186163

 epoch: 224 ---> elapsed time:  1.680000, quantization error: 1.181475

 epoch: 225 ---> elapsed time:  1.655000, quantization error: 1.176786

 epoch: 226 ---> elapsed time:  1.739000, quantization error: 1.172074

 epoch: 227 ---> elapsed time:  1.797000, quantization error: 1.167346

 epoch: 228 ---> elapsed time:  1.779000, quantization error: 1.162535

 epoch: 229 ---> elapsed time:  1.783000, quantization error: 1.157675

 epoch: 230 ---> elapsed time:  1.826000, quantization error: 1.152828

 epoch: 231 ---> elapsed time:  1.811000, quantization error: 1.148043

 epoch: 232 ---> elapsed time:  1.716000, quantization error: 1.143239

 epoch: 233 ---> elapsed time:  1.730000, quantization error: 1.138440

 epoch: 234 ---> elapsed time:  1.769000, quantization error: 1.133686

 epoch: 235 ---> elapsed time:  1.794000, quantization error: 1.128930

 epoch: 236 ---> elapsed time:  1.749000, quantization error: 1.124193

 epoch: 237 ---> elapsed time:  1.775000, quantization error: 1.119359

 epoch: 238 ---> elapsed time:  1.700000, quantization error: 1.114533

 epoch: 239 ---> elapsed time:  1.655000, quantization error: 1.109698

 epoch: 240 ---> elapsed time:  1.761000, quantization error: 1.104849

 epoch: 241 ---> elapsed time:  1.648000, quantization error: 1.099992

 epoch: 242 ---> elapsed time:  1.678000, quantization error: 1.095067

 epoch: 243 ---> elapsed time:  1.689000, quantization error: 1.089988

 epoch: 244 ---> elapsed time:  1.689000, quantization error: 1.084860

 epoch: 245 ---> elapsed time:  1.775000, quantization error: 1.079676

 epoch: 246 ---> elapsed time:  1.718000, quantization error: 1.074436

 epoch: 247 ---> elapsed time:  1.686000, quantization error: 1.069220

 epoch: 248 ---> elapsed time:  1.605000, quantization error: 1.064023

 epoch: 249 ---> elapsed time:  1.619000, quantization error: 1.058738

 epoch: 250 ---> elapsed time:  1.658000, quantization error: 1.053405

 epoch: 251 ---> elapsed time:  1.625000, quantization error: 1.047970

 epoch: 252 ---> elapsed time:  1.742000, quantization error: 1.042683

 epoch: 253 ---> elapsed time:  1.693000, quantization error: 1.037444

 epoch: 254 ---> elapsed time:  1.833000, quantization error: 1.032181

 epoch: 255 ---> elapsed time:  1.788000, quantization error: 1.026723

 epoch: 256 ---> elapsed time:  1.779000, quantization error: 1.021298

 epoch: 257 ---> elapsed time:  1.685000, quantization error: 1.016041

 epoch: 258 ---> elapsed time:  1.621000, quantization error: 1.010827

 epoch: 259 ---> elapsed time:  1.702000, quantization error: 1.005597

 epoch: 260 ---> elapsed time:  1.709000, quantization error: 1.000311

 epoch: 261 ---> elapsed time:  1.651000, quantization error: 0.995066

 epoch: 262 ---> elapsed time:  1.664000, quantization error: 0.989861

 epoch: 263 ---> elapsed time:  1.733000, quantization error: 0.984654

 epoch: 264 ---> elapsed time:  1.843000, quantization error: 0.979427

 epoch: 265 ---> elapsed time:  1.854000, quantization error: 0.974123

 epoch: 266 ---> elapsed time:  1.714000, quantization error: 0.968676

 epoch: 267 ---> elapsed time:  1.689000, quantization error: 0.963157

 epoch: 268 ---> elapsed time:  1.664000, quantization error: 0.957659

 epoch: 269 ---> elapsed time:  1.667000, quantization error: 0.952203

 epoch: 270 ---> elapsed time:  1.660000, quantization error: 0.946722

 epoch: 271 ---> elapsed time:  1.657000, quantization error: 0.941184

 epoch: 272 ---> elapsed time:  1.717000, quantization error: 0.935787

 epoch: 273 ---> elapsed time:  1.781000, quantization error: 0.930417

 epoch: 274 ---> elapsed time:  1.807000, quantization error: 0.925120

 epoch: 275 ---> elapsed time:  1.676000, quantization error: 0.919871

 epoch: 276 ---> elapsed time:  1.685000, quantization error: 0.914610

 epoch: 277 ---> elapsed time:  1.647000, quantization error: 0.909346

 epoch: 278 ---> elapsed time:  1.631000, quantization error: 0.904078

 epoch: 279 ---> elapsed time:  1.611000, quantization error: 0.898812

 epoch: 280 ---> elapsed time:  1.649000, quantization error: 0.893523

 epoch: 281 ---> elapsed time:  1.671000, quantization error: 0.888205

 epoch: 282 ---> elapsed time:  1.719000, quantization error: 0.882775

 epoch: 283 ---> elapsed time:  1.766000, quantization error: 0.877278

 epoch: 284 ---> elapsed time:  1.664000, quantization error: 0.871760

 epoch: 285 ---> elapsed time:  1.698000, quantization error: 0.866196

 epoch: 286 ---> elapsed time:  1.613000, quantization error: 0.860560

 epoch: 287 ---> elapsed time:  1.596000, quantization error: 0.854923

 epoch: 288 ---> elapsed time:  1.615000, quantization error: 0.849249

 epoch: 289 ---> elapsed time:  1.617000, quantization error: 0.843664

 epoch: 290 ---> elapsed time:  1.668000, quantization error: 0.838004

 epoch: 291 ---> elapsed time:  1.712000, quantization error: 0.832225

 epoch: 292 ---> elapsed time:  1.764000, quantization error: 0.826474

 epoch: 293 ---> elapsed time:  1.789000, quantization error: 0.820730

 epoch: 294 ---> elapsed time:  1.698000, quantization error: 0.814957

 epoch: 295 ---> elapsed time:  1.896000, quantization error: 0.809121

 epoch: 296 ---> elapsed time:  1.768000, quantization error: 0.803311

 epoch: 297 ---> elapsed time:  1.708000, quantization error: 0.797495

 epoch: 298 ---> elapsed time:  1.654000, quantization error: 0.791691

 epoch: 299 ---> elapsed time:  1.704000, quantization error: 0.785888

 epoch: 300 ---> elapsed time:  1.654000, quantization error: 0.780123

 Final quantization error: 0.780123
 train took: 1065.312000 seconds
In [246]:
# Coordinates of the units in the input space
sm.get_node_vectors()
Out[246]:
array([[0.01384494, 0.77377397, 0.03218156, ..., 0.53154632, 0.6131813 ,
        0.61187295],
       [0.01671421, 0.70239735, 0.03043068, ..., 0.55148382, 0.68248383,
        0.70064078],
       [0.01814341, 0.63261248, 0.02876797, ..., 0.59609036, 0.64990893,
        0.76612686],
       ...,
       [0.00674522, 0.22744574, 0.05514482, ..., 0.28431413, 0.08964352,
        0.0793221 ],
       [0.00897529, 0.22122668, 0.06350202, ..., 0.28818322, 0.0970572 ,
        0.07545301],
       [0.01067127, 0.21765094, 0.07442989, ..., 0.29058407, 0.11284141,
        0.07305251]])
In [247]:
# Component planes on the 50x50 grid
sns.set()
view2D = View2D(40,25,"", text_size=20)
view2D.show(sm, col_sz=3, what='codebook')
plt.subplots_adjust(top=0.90)
plt.suptitle("Component Planes", fontsize=20)
plt.savefig(os.path.join('Component Planes.png'), dpi=300)
plt.show()
In [253]:
# U-matrix of the 50x50 grid
u = sompy.umatrix.UMatrixView(12, 12, 'umatrix', show_axis=True, text_size=8, show_text=True)

UMAT = u.show(
    sm, 
    distance2=1, 
    row_normalized=False, 
    show_data=True, 
    contooor=True # Visualize isomorphic curves
    
)
plt.savefig(os.path.join('umatrix.png'), dpi=300)
<Figure size 576x396 with 0 Axes>
In [ ]:
#df_=pd.DataFrame(sm.get_node_vectors())
#df_

K-Means on top of SOM units

In [259]:
# Perform K-Means clustering on top of the 2500 untis (sm.get_node_vectors() output)
kmeans = KMeans(n_clusters=3, init='k-means++', n_init=20, random_state=42)
nodeclus_labels = sm.cluster(kmeans)

hits  = HitMapView(12, 12,"Clustering", text_size=10)
hits.show(sm, anotate=True, onlyzeros=False, labelsize=7, cmap="Pastel1")

plt.show()
In [256]:
# Check the nodes and and respective clusters
nodes = sm.get_node_vectors()

df_nodes = pd.DataFrame(nodes, columns=metric_features_nmulticolinearete)
df_nodes['label'] = nodeclus_labels
df_nodes['label'].unique()
Out[256]:
array([2, 0, 1, 3])
In [257]:
# Obtaining SOM's BMUs labels
bmus_map = sm.find_bmu(clusterdataset_minmax_no_outliers)[0]  # get bmus for each observation in df

df_bmus = pd.DataFrame(
    np.concatenate(( clusterdataset_minmax_no_outliers, np.expand_dims(bmus_map,1)), axis=1),
    index= clusterdataset_minmax_no_outliers.index, columns=np.append( clusterdataset_minmax_no_outliers.columns,"BMU")
)
df_bmus
Out[257]:
RAMNTALL IC1 AVGGIFT month_minimum_gift months_lastgift month_largest_gift month_of_last_gift BMU
CONTROLN
95515 0.040093 0.204667 0.012946 0.636364 0.454545 0.090909 1.000000 1070.0
148535 0.006005 0.725333 0.028836 0.818182 0.454545 1.000000 1.000000 457.0
15078 0.033381 0.167333 0.012423 0.909091 0.454545 0.545455 1.000000 755.0
172556 0.016955 0.257333 0.011082 0.909091 0.454545 0.909091 1.000000 754.0
7112 0.042565 0.160000 0.011187 0.818182 0.363636 0.000000 0.000000 1654.0
... ... ... ... ... ... ... ... ...
58178 0.008124 0.106000 0.009252 0.000000 0.636364 0.636364 0.818182 673.0
156106 0.011833 0.149333 0.050893 0.636364 0.818182 1.000000 0.636364 1554.0
35088 0.012010 0.190000 0.004189 0.090909 0.272727 0.181818 0.090909 673.0
184568 0.002119 0.288667 0.047551 0.090909 0.272727 0.090909 0.090909 1779.0
122706 0.001236 0.537333 0.037525 0.181818 0.181818 0.181818 0.181818 1552.0

83999 rows × 8 columns

In [258]:
# Get cluster labels for each observation
df_final = df_bmus.merge(df_nodes['label'], how='left', left_on="BMU", right_index=True)
df_final['label'].unique()
Out[258]:
array([1, 2, 3])
In [ ]:
 
In [ ]:
 

Characterizing the final clusters

Lets define the features to describe the clusters

In [192]:
non_metric_features=["donor_resp_maill_offer", "donor_interest_collecting","donor_have_child_y_n",\
                     "urban_city_level", "social_economical_status", 'GENDER', 'Group_age', ]
In [193]:
metric_features_describe_cluster=["AVGGIFT", "NGIFTALL", "IC1", "MINRAMNT", "MAXRAMNT", "months_lastgift", "ETH14"]

Merging the dataset with cluster solution and with the original dataset

In [194]:
# Creating a copy for catergorical dataset
datalapsed_caterorical= datasetlapsed[non_metric_features].copy()
In [195]:
# Transforming categorical variables into dummies
datalapsed_caterorical = pd.get_dummies(datalapsed_caterorical, non_metric_features)
In [196]:
datalapsed_caterorical
Out[196]:
donor_resp_maill_offer_None donor_resp_maill_offer_both donor_resp_maill_offer_hit donor_resp_maill_offer_other types donor_interest_collecting_no donor_interest_collecting_yes donor_have_child_y_n_no donor_have_child_y_n_yes urban_city_level_City urban_city_level_Rural ... GENDER_M GENDER_U Group_age_Age 0-18 Group_age_Age 18-24 Group_age_Age 25-34 Group_age_Age 35-44 Group_age_Age 45-54 Group_age_Age 55-64 Group_age_Age 65-74 Group_age_Age >= 75
CONTROLN
95515 1 0 0 0 1 0 0 1 0 0 ... 0 0 0 0 0 0 0 1 0 0
148535 0 1 0 0 1 0 0 1 0 0 ... 1 0 0 0 0 0 1 0 0 0
15078 0 1 0 0 1 0 0 1 0 1 ... 1 0 0 0 0 1 0 0 0 0
172556 0 1 0 0 1 0 0 1 0 1 ... 0 0 0 0 0 0 0 0 1 0
7112 0 1 0 0 0 1 0 1 0 0 ... 0 0 0 0 0 0 0 0 0 1
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
58178 1 0 0 0 0 1 0 1 0 1 ... 0 0 0 0 0 0 0 1 0 0
156106 1 0 0 0 1 0 0 1 1 0 ... 0 0 0 0 0 1 0 0 0 0
35088 0 1 0 0 1 0 0 1 0 0 ... 0 0 0 0 0 0 1 0 0 0
184568 1 0 0 0 1 0 0 1 1 0 ... 1 0 0 0 1 0 0 0 0 0
122706 0 1 0 0 1 0 0 1 1 0 ... 1 0 0 0 0 0 1 0 0 0

84125 rows × 28 columns

In [197]:
# Concatenating the origina data with df_labes for Characterizing the final clusters
datalapsed_caterorical = pd.concat((datalapsed_caterorical, df_labels), axis=1)
In [198]:
demographic_analises= datalapsed_caterorical.groupby('labelskmeans++').sum()
demographic_analises.columns
Out[198]:
Index(['donor_resp_maill_offer_None', 'donor_resp_maill_offer_both',
       'donor_resp_maill_offer_hit', 'donor_resp_maill_offer_other types',
       'donor_interest_collecting_no', 'donor_interest_collecting_yes',
       'donor_have_child_y_n_no', 'donor_have_child_y_n_yes',
       'urban_city_level_City', 'urban_city_level_Rural',
       'urban_city_level_Suburban', 'urban_city_level_Town',
       'urban_city_level_Urban', 'social_economical_status_Above average SES',
       'social_economical_status_Below average SES',
       'social_economical_status_Highest SES',
       'social_economical_status_Lowest SES', 'GENDER_F', 'GENDER_M',
       'GENDER_U', 'Group_age_Age 0-18', 'Group_age_Age 18-24',
       'Group_age_Age 25-34', 'Group_age_Age 35-44', 'Group_age_Age 45-54',
       'Group_age_Age 55-64', 'Group_age_Age 65-74', 'Group_age_Age >= 75'],
      dtype='object')
In [199]:
# Table for urdan results 
urban=['urban_city_level_City','urban_city_level_Rural','urban_city_level_Suburban', 'urban_city_level_Town',
       'urban_city_level_Urban']
demographic_analises[urban]
Out[199]:
urban_city_level_City urban_city_level_Rural urban_city_level_Suburban urban_city_level_Town urban_city_level_Urban
labelskmeans++
0.0 5813.0 5974.0 7026.0 5873.0 3739.0
1.0 7035.0 7100.0 8439.0 6968.0 4289.0
2.0 4495.0 4499.0 5481.0 4547.0 2721.0
In [200]:
#save to csv 
demographic_analises[urban].to_csv(os.path.join("urban.csv"), index=True)
In [201]:
# Table for social_economical_status results
social_economical_status= ['social_economical_status_Above average SES','social_economical_status_Below average SES',\
                          'social_economical_status_Highest SES','social_economical_status_Lowest SES']
demographic_analises[social_economical_status]
Out[201]:
social_economical_status_Above average SES social_economical_status_Below average SES social_economical_status_Highest SES social_economical_status_Lowest SES
labelskmeans++
0.0 14448.0 5077.0 8362.0 538.0
1.0 17055.0 6083.0 10048.0 645.0
2.0 11021.0 3734.0 6589.0 399.0
In [202]:
#save to csv 
demographic_analises[social_economical_status].to_csv(os.path.join("social.csv"), index=True)
In [203]:
# Table for age results
age =['Group_age_Age 0-18', 'Group_age_Age 18-24','Group_age_Age 25-34', 'Group_age_Age 35-44', 'Group_age_Age 45-54',
       'Group_age_Age 55-64', 'Group_age_Age 65-74', 'Group_age_Age >= 75']
demographic_analises[age]
Out[203]:
Group_age_Age 0-18 Group_age_Age 18-24 Group_age_Age 25-34 Group_age_Age 35-44 Group_age_Age 45-54 Group_age_Age 55-64 Group_age_Age 65-74 Group_age_Age >= 75
labelskmeans++
0.0 144.0 187.0 950.0 6637.0 7310.0 3677.0 3425.0 6095.0
1.0 184.0 241.0 1066.0 7457.0 8835.0 4290.0 4101.0 7657.0
2.0 126.0 148.0 644.0 4622.0 5582.0 3008.0 2672.0 4941.0
In [266]:
#save to csv 
demographic_analises[age].to_csv(os.path.join("age.csv"), index=True)
In [205]:
# Table for resp results
resp=['donor_resp_maill_offer_None', 'donor_resp_maill_offer_both',
       'donor_resp_maill_offer_hit', 'donor_resp_maill_offer_other types']
demographic_analises[resp]
Out[205]:
donor_resp_maill_offer_None donor_resp_maill_offer_both donor_resp_maill_offer_hit donor_resp_maill_offer_other types
labelskmeans++
0.0 16902.0 8784.0 2710.0 29.0
1.0 19521.0 10813.0 3473.0 24.0
2.0 12619.0 7018.0 2085.0 21.0
In [206]:
#save to csv 
demographic_analises[resp].to_csv(os.path.join("resp.csv"), index=True)
In [207]:
# Table for interest results
interest=['donor_interest_collecting_no', 'donor_interest_collecting_yes']
demographic_analises[interest]
Out[207]:
donor_interest_collecting_no donor_interest_collecting_yes
labelskmeans++
0.0 19219.0 9206.0
1.0 22252.0 11579.0
2.0 14582.0 7161.0
In [208]:
#save to csv 
demographic_analises[interest].to_csv(os.path.join("interest.csv"), index=True)
In [264]:
# Table for sex results
sex=['GENDER_F', 'GENDER_M']
demographic_analises[sex]
Out[264]:
GENDER_F GENDER_M
labelskmeans++
0.0 15810.0 12404.0
1.0 19654.0 13977.0
2.0 12825.0 8794.0
In [265]:
#save to csv 
demographic_analises[sex].to_csv(os.path.join("sex.csv"), index=True)
In [211]:
# Creating a copy for metric_features_describe_cluster dataset
datalapsed_metric_cluster= datasetlapsed[metric_features_describe_cluster].copy()
In [212]:
datalapsed_metric_cluster
Out[212]:
AVGGIFT NGIFTALL IC1 MINRAMNT MAXRAMNT months_lastgift ETH14
CONTROLN
95515 7.741935 31 307 5.0 12.0 18 0
148535 15.666667 3 1088 10.0 25.0 18 0
15078 7.481481 27 251 2.0 16.0 18 0
172556 6.812500 16 386 2.0 11.0 18 0
7112 6.864865 37 240 3.0 15.0 17 0
... ... ... ... ... ... ... ...
58178 5.900000 10 159 3.0 11.0 20 0
156106 26.666667 3 224 25.0 30.0 22 0
35088 3.375000 24 285 2.0 9.0 16 0
184568 25.000000 1 433 25.0 25.0 16 1
122706 20.000000 1 806 20.0 20.0 15 0

84125 rows × 7 columns

In [213]:
# Concatenating the origina data with df_labes for Characterizing the final clusters
datalapsed_metric_cluster = pd.concat((datalapsed_metric_cluster, df_labels), axis=1)
In [214]:
# Creating a data frame with the mean values for each cluster
Cluster=datalapsed_metric_cluster.groupby('labelskmeans++').mean()
Cluster
Out[214]:
AVGGIFT NGIFTALL IC1 MINRAMNT MAXRAMNT months_lastgift ETH14
labelskmeans++
0.0 13.909387 8.732735 338.511310 9.015920 19.860081 19.703817 0.316482
1.0 12.618076 9.487245 337.372853 8.036376 18.228227 16.035411 0.301085
2.0 12.703216 9.815665 339.745205 6.698830 19.953835 19.897254 0.286943
In [215]:
#save AD to csv 
Cluster.to_csv(os.path.join("Cluster.csv"), index=True)
In [216]:
# features for analyse the active donor 
metric_features_describe_clusterActive=["AVGGIFT", "NGIFTALL", "IC1", "MINRAMNT", "MAXRAMNT", "months_lastgift",\
                                        "DONOR_TYPE", "ETH14"]
In [217]:
# Creating a data frame with the mean values for each active donor 
AD=datasetactive[metric_features_describe_clusterActive].groupby('DONOR_TYPE').mean()
In [218]:
AD
Out[218]:
AVGGIFT NGIFTALL IC1 MINRAMNT MAXRAMNT months_lastgift ETH14
DONOR_TYPE
ACTIVE DONOR 15.209248 16.454224 352.365195 5.792257 27.342166 6.538966 0.261538
In [219]:
#save AD to csv for kaggle
AD.to_csv(os.path.join("AD.csv"), index=True)
In [220]:
# Creating a data frame with the mean values for each inactive donor 
ID=datasetinactive[metric_features_describe_clusterActive].groupby('DONOR_TYPE').mean()
In [221]:
#save ID to csv for kaggle
ID.to_csv(os.path.join("ID.csv"), index=True)
In [222]:
ID
Out[222]:
AVGGIFT NGIFTALL IC1 MINRAMNT MAXRAMNT months_lastgift ETH14
DONOR_TYPE
INACTIVE DONOR 14.422362 9.084211 340.40164 7.615356 22.969932 25.736022 0.323308
In [ ]:
 

Assess feature importance and reclassify outliers

In [223]:
### Using the R²
#What proportion of each variables total SS is explained between clusters?
In [224]:
def get_ss_variables(df):
    """Get the SS for each variable
    """
    ss_vars = df.var() * (df.count() - 1)
    return ss_vars

def r2_variables(df, labels):
    """Get the R² for each variable
    """
    sst_vars = get_ss_variables(df)
    ssw_vars = np.sum(df.groupby(labels).apply(get_ss_variables))
    return 1 - ssw_vars/sst_vars
In [225]:
# We are essentially decomposing the R² into the R² for each variable
r2_variables(df[metric_features.to_list() + ['merged_labels']], 'merged_labels').drop('merged_labels')
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-225-a876e2e85067> in <module>
      1 # We are essentially decomposing the R² into the R² for each variable
----> 2 r2_variables(df[metric_features.to_list() + ['merged_labels']], 'merged_labels').drop('merged_labels')

AttributeError: 'list' object has no attribute 'to_list'
In [ ]:
### Using a Decision Tree
We get the normalized total reduction of the criterion (gini or entropy) brought by that feature (also known as Gini importance).
In [ ]:
# Preparing the data
X = df.drop(columns=['product_labels','behavior_labels','merged_labels'])
y = df.merged_labels

# Splitting the data
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.2, random_state=42
)

# Fitting the decision tree
dt = DecisionTreeClassifier(random_state=42, max_depth=3)
dt.fit(X_train, y_train)
print("It is estimated that in average, we are able to predict {0:.2f}% of the customers correctly".format(dt.score(X_test, y_test)*100))
In [ ]:
# Assessing feature importance
pd.Series(dt.feature_importances_, index=X_train.columns)
In [ ]:
# Predicting the cluster labels of the outliers
df_out['merged_labels'] = dt.predict(df_out.drop(columns=['rcn']))
df_out.head()
In [ ]:
# Visualizing the decision tree
dot_data = export_graphviz(dt, out_file=None, 
                           feature_names=X.columns.to_list(),
                           filled=True,
                           rounded=True,
                           special_characters=True)  
graphviz.Source(dot_data)

Marketing Approach

Features For marketing aproch

In [226]:
# selecting the features for the marketing approach
marketing_aproch= ["month_largest_gift", "month_minimum_gift","MINRAMNT","MAXRAMNT", "ETH14"]# "RFA_2F", "RFA_2A",
In [227]:
# Creating a copy for metric_features_describe_cluster dataset
datalapsed_marketing_aproch= datasetlapsed[marketing_aproch].copy()
In [228]:
# Concatenating the origina data with df_labes for marketing approach
datalapsed_marketing_aproch = pd.concat((datasetlapsed[marketing_aproch], df_labels), axis=1)
In [229]:
datalapsed_marketing_aproch
Out[229]:
month_largest_gift month_minimum_gift MINRAMNT MAXRAMNT ETH14 labelskmeans++
4 11 2 5.0 50.0 0 2.0
8 7 11 3.0 15.0 1 0.0
13 12 2 3.0 25.0 0 2.0
15 9 11 5.0 20.0 1 1.0
17 11 11 15.0 26.0 0 0.0
... ... ... ... ... ... ...
191770 11 3 2.0 7.0 0 1.0
191772 11 11 15.0 15.0 0 0.0
191777 4 3 5.0 7.0 0 1.0
191778 1 2 7.0 60.0 0 1.0
191779 6 6 25.0 25.0 0 2.0

84125 rows × 6 columns

In [230]:
# Approach 1: When who the clusters who spend most gift and when 
In [234]:
# Adapted from:
# https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-the-master-plots-python/#26.-Box-Plot


from sklearn.cluster import AgglomerativeClustering
from scipy.spatial import ConvexHull

# Import Data
df = datalapsed_marketing_aproch

# Agglomerative Clustering
#cluster = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')  
#cluster.fit_predict(df[['Murder', 'Assault', 'UrbanPop', 'Rape']])  

# Plot
plt.figure(figsize=(14, 10), dpi= 300)  
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=datalapsed_marketing_aproch["labelskmeans++"], cmap='tab10')  

# Encircle
def encircle(x,y, ax=None, **kw):
    if not ax: ax=plt.gca()
    p = np.c_[x,y]
    hull = ConvexHull(p)
    poly = plt.Polygon(p[hull.vertices,:], **kw)
    ax.add_patch(poly)

# Draw polygon surrounding vertices    
encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 0, 'month_largest_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"]== 0, 'MAXRAMNT'], ec="k", fc="gold", alpha=0.2, linewidth=0, label="cluster 0")
encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 1, 'month_largest_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 1, 'MAXRAMNT'], ec="k", fc="tab:blue", alpha=0.2, linewidth=0, label="cluster 1")
encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 2, 'month_largest_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 2, 'MAXRAMNT'], ec="k", fc="tab:red", alpha=0.2, linewidth=0, label="cluster 2")
#encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 3, 'month_largest_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 3, 'MAXRAMNT'], ec="k", fc="tab:green", alpha=0.2, linewidth=0, label="cluster 3")
#encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 4, 'month_largest_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 4, 'Assault'], ec="k", fc="tab:orange", alpha=0.2, linewidth=0, label="Individuals")

# Decorations
plt.legend()
plt.xlabel('Month associated with the largest gift'); plt.xticks(fontsize=12)
plt.ylabel('Dollar amount of largest gift'); plt.yticks(fontsize=12)
#plt.title('Agglomerative Clustering of USArrests (5 Groups)', fontsize=22)
plt.savefig(os.path.join('month_largest_vs_MAXRANT.jpg'))
plt.show()
In [235]:
# Approach 2: When who the clusters who mim gift and when 
In [236]:
# Adapted from:
# https://www.machinelearningplus.com/plots/top-50-matplotlib-visualizations-the-master-plots-python/#26.-Box-Plot
from sklearn.cluster import AgglomerativeClustering
from scipy.spatial import ConvexHull

# Import Data
df = datalapsed_marketing_aproch

# Agglomerative Clustering
#cluster = AgglomerativeClustering(n_clusters=5, affinity='euclidean', linkage='ward')  
#cluster.fit_predict(df[['Murder', 'Assault', 'UrbanPop', 'Rape']])  

# Plot
plt.figure(figsize=(14, 10), dpi= 300)  
plt.scatter(df.iloc[:,0], df.iloc[:,1], c=datalapsed_marketing_aproch["labelskmeans++"], cmap='tab10')  

# Encircle
def encircle(x,y, ax=None, **kw):
    if not ax: ax=plt.gca()
    p = np.c_[x,y]
    hull = ConvexHull(p)
    poly = plt.Polygon(p[hull.vertices,:], **kw)
    ax.add_patch(poly)

# Draw polygon surrounding vertices    
encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 0, 'month_minimum_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"]== 0, 'MINRAMNT'], ec="k", fc="gold", alpha=0.2, linewidth=0, label="cluster 0")
encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 1, 'month_minimum_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 1, 'MINRAMNT'], ec="k", fc="tab:blue", alpha=0.2, linewidth=0, label="cluster 1")
encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 2, 'month_minimum_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 2, 'MINRAMNT'], ec="k", fc="tab:red", alpha=0.2, linewidth=0, label="cluster 2")
#encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 3, 'month_minimum_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 3, 'MINRAMNT'], ec="k", fc="tab:green", alpha=0.2, linewidth=0, label="cluster 3")
#encircle(df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 4, 'month_largest_gift'], df.loc[datalapsed_marketing_aproch["labelskmeans++"] == 4, 'Assault'], ec="k", fc="tab:orange", alpha=0.2, linewidth=0, label="Individuals")

# Decorations
plt.legend()
plt.xlabel('Month associated with the smallest gift '); plt.xticks(fontsize=12)
plt.ylabel('Dollar amount of smallest gift'); plt.yticks(fontsize=12)
#plt.title('Agglomerative Clustering of USArrests (5 Groups)', fontsize=22)
plt.savefig(os.path.join('month_smallest_giftvs_MINRAMNT.jpg'))
plt.show()
In [ ]:
 
In [ ]:
 
In [237]:
# Approach 3: Puerto rican population 
In [ ]:
 
In [239]:
Pouertto rican=datalapsed_marketing_aproch.groupby(["labelskmeans++"]).mean()["ETH14"]
Out[239]:
labelskmeans++
0.0    0.316482
1.0    0.301085
2.0    0.286943
Name: ETH14, dtype: float64
In [254]:
#save AD to csv for kaggle
datalapsed_marketing_aproch.groupby(["labelskmeans++"]).mean()["ETH14"].to_csv(os.path.join("Pouertto rican.csv"), index=True)
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 

Kmeans ++

In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 

SOM

In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
 
In [ ]:
sm.cluster??
In [ ]:
 
In [ ]:
 
In [ ]: